无法将数据以块的形式发送到Golang中的服务器

时间:2017-05-30 14:53:03

标签: go multipart

我对Golang完全不熟悉。我正在尝试从客户端向服务器发送文件。客户端应将其拆分为较小的块并将其发送到服务器公开的其余端点。服务器应该组合这些块并保存它。

这是我到目前为止编写的clientserver代码。当我运行它来复制大小为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

3 个答案:

答案 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。这就是容易处理大文件的方式。
  • 您将遇到中间框和反向代理问题。我们必须更改Nginx中的默认值,以便它不会切断大文件。 Nginx(或者你可能使用的任何反向代理)需要合作,因为它们通常默认为一些非常小的文件大小,如300MB。
  • 即使您认为您在使用某些文件部分技巧上传处理此问题,您仍需要在下载时处理大文件。通过从文件句柄到文件句柄执行Copy,Go可以非常有效地执行单个大文件。如果您希望获得下载上传文件的出色性能,则最终还需要支持部分内容(http 206)而不是修改(304)。有些浏览器会忽略您在涉及大型视频等内容时不要求部分内容的请求。因此,如果您不支持此功能,则某些内容将无法下载。

如果你想使用一些技巧来切割文件并将它们分成几部分发送,那么你最终需要使用特定的Javascript库。如果您要从任何客户端到Go服务器进行编程访问,这对互操作性将是非常有害的。但也许你无法修复强加大小限制的中间框,而你真的想要将文件剪切成块。您将需要做大量的工作来处理下载以块为单位上传的文件。

答案 2 :(得分:-1)

你要做的是用大多数其他语言的tcp连接编写的典型代码,在GO中你也可以使用tcp和net.Listen并最终接受侦听器对象。那应该没问题。