我对Golang完全不熟悉。我正在尝试从客户端向服务器发送文件。客户端应将其拆分为较小的块并将其发送到服务器公开的其余端点。服务器应该组合这些块并保存它。
这是我到目前为止编写的client和server代码。当我运行它来复制大小为39字节的文件时,客户端正在向服务器发送两个请求。但是服务器显示以下错误。
2017/05/30 20:19:28 Was not able to access the uploaded file: unexpected EOF
2017/05/30 20:19:28 Was not able to access the uploaded file: multipart: NextPart: EOF
答案 0 :(得分:1)
您将缓冲区与文件分成单独的块,并将每个缓冲区作为单独的HTTP消息发送。这不是multipart
的用途。
multipart
MIME表示单个 HTTP消息可能包含一个或多个实体,引用HTTP RFC:
MIME提供了许多" multipart"类型 - 封装 单个邮件正文中的一个或多个实体。所有多部分类型 共享一个通用语法,如RFC 2046的5.1.1节中所定义
您应该发送整个文件并将其发送到单个HTTP消息中(文件内容应该是单个实体)。 HTTP协议将处理其余部分,但如果您计划传输的文件很大(例如> 2GB
),则可以考虑使用FTP。
答案 1 :(得分:0)
如果您使用的是multipart / form-data,则需要将整个文件作为单字节流发送。 Go可以通过这种方式轻松处理多GB文件。但是你的代码需要对此有所了解。
ioutil.ReadAll(r.Body)
是不可能的。请不要这样做。multipartReader, err := r.MultipartReader()
使用多部分阅读器。这将按照编码中包含的顺序迭代上传文件。这很重要,因为您可以将文件完全保留在内存中,并从一个文件句柄到另一个文件句柄执行Copy
。这就是容易处理大文件的方式。Copy
,Go可以非常有效地执行单个大文件。如果您希望获得下载上传文件的出色性能,则最终还需要支持部分内容(http 206)而不是修改(304)。有些浏览器会忽略您在涉及大型视频等内容时不要求部分内容的请求。因此,如果您不支持此功能,则某些内容将无法下载。如果你想使用一些技巧来切割文件并将它们分成几部分发送,那么你最终需要使用特定的Javascript库。如果您要从任何客户端到Go服务器进行编程访问,这对互操作性将是非常有害的。但也许你无法修复强加大小限制的中间框,而你真的想要将文件剪切成块。您将需要做大量的工作来处理下载以块为单位上传的文件。
答案 2 :(得分:-1)
你要做的是用大多数其他语言的tcp连接编写的典型代码,在GO中你也可以使用tcp和net.Listen并最终接受侦听器对象。那应该没问题。