英文:
Copy a file from client to server via rest end point using golang
问题
我想通过服务器暴露的 REST 端点将文件从客户端复制到服务器。我在 Stack Overflow 上参考了各种问题和答案,但是没有得到清晰的图片。
我只想要一个在 Golang 中的示例客户端和服务器代码,用于从客户端复制文件并保存到服务器上。
提前感谢。
英文:
I want to copy a file from the client to the server through the rest end point exposed by the server. I referred the various questions and answers in stackoverflow but I could not get a clear picture of it.
I just want a sample client and server code in golang to copy the file from client and save it on the server.
Thanks in advance.
答案1
得分: 0
方向:服务器到客户端
好的,让我们从服务器端开始。请查看我在CSVStorageServer
服务器中的WebLoad.go
文件:(Github链接)
在第17行,我定义了Web服务器的处理程序。该方法将根据需要构建一个zip文件并将其发送到浏览器。与您的问题相关的重要部分是第77到82行。在这里,我设置了客户端的标头,例如内容长度和类型。第82行将整个数据发送到客户端。它将字节从按需zip文件复制到传输线上。
在客户端上,您可以触发一个GET
请求并存储结果。这是一个示例:https://golang.org/pkg/net/http/#example_Get
使用http.Get(...
触发GET
请求。使用ioutil.ReadAll(res.Body)
从服务器读取所有字节并将其存储到一个变量中。然后,您可以将字节写入磁盘或在内存中处理它。
希望这个答案对您有帮助。
祝好,Thorsten
编辑#1:
关于REST端点,请参考服务器定义(Github链接)。第16行定义了此处理程序的REST端点。在这种情况下,它作为/load
可用。您可以在此处使用任何类似REST的路径,例如/open/file/USERID/send
等。
方向:客户端到服务器
要将文件从客户端复制到服务器端,需要类似的操作。在客户端上,需要一个POST
请求,格式为multipart/form-data
。这是一个很好的例子:博客文章链接。此示例还考虑了服务器部分。相关的客户端部分是函数func postFile(filename string, targetUrl string) error { ... }
。
对于服务器部分,这是一个示例:Github链接。此示例从客户端接收文件并将其写入MongoDB数据库。相关部分如下:
第39行从客户端读取文件:file, fileHeader, fileError := request.FormFile("file")
。结果是对上传文件的句柄。
第60行将源(浏览器或Go客户端)中的所有字节复制到目标(这里是MongoDB):_, errCopy := io.Copy(newFile, file)
。
编辑#2:
这是一个完整的工作示例:https://github.com/SommerEngineering/Example010,其中客户端和服务器在同一个程序中。将其拆分为两个程序应该很容易。
英文:
Direction: Server to Client
So -- both sides are in Go? Okay, let's start with the server side. See my WebLoad.go
file from my CSVStorageServer
server: (Link to Github)
At line 17, I define the handler for the web server. This method will build a zip file on-demand and send it to the browser. The important part regarding to your question are line 77 up to 82. Here, I set the headers for the client, e.g. content length and type. Line 82 sends the whole data to the client side. It copies the bytes from the on-demand zip file to the wire.
On the client side, you trigger e.g. a GET
request and store the result. Here an example: https://golang.org/pkg/net/http/#example_Get
With http.Get(...
you trigger the GET
request. With ioutil.ReadAll(res.Body)
you read all bytes from the server and store it to a variable. Afterwards, you could write the bytes to the disk or process it in-memory.
I hope, this answer helps you.
Best regards, Thorsten
Edit #1:
Regarding the REST end-point, cf. the server definition (link to Github). Line 16 defines the REST end-point for this handler. In this case, it gets available as /load
. You could use any REST-like path here, e.g. /open/file/USERID/send
, etc.
Direction: Client to Server
In order to copy a file from client to server side, similar operations are necessary. On the client side, a POST
request is necessary as multipart/form-data
. Here is a good example for this: Link to a blog post. This example considers also the server part. The relevant client part is the function func postFile(filename string, targetUrl string) error { ... }
.
For the server part, here an own example: Link to Github. This example receives an file from the client and writes it to a MongoDB database. The relevant parts are:
Line 39 read the file from the client: file, fileHeader, fileError := request.FormFile("file")
The result is a handle to this uploaded file.
Line 60 copies all bytes from the source (browser or Go client) into a destination (here, the MongoDB): _, errCopy := io.Copy(newFile, file)
.
Edit #2:
Here is a full working example: https://github.com/SommerEngineering/Example010 where client and server are in the same program. It should be easy to split it into two programs.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论