无法将数据分块发送到Golang中的服务器

无法将数据分块发送到Golang中的服务器,go,multipart,Go,Multipart,我对Golang完全陌生。我正在尝试将文件从客户端发送到服务器。客户机应该将其分割成更小的块,并将其发送到服务器公开的rest端点。服务器应该组合这些块并保存它 这是我到目前为止所写的最新版本和代码。当我运行这个程序来复制一个大小为39字节的文件时,客户端向服务器发送了两个请求。但是服务器显示以下错误 2017/05/30 20:19:28 Was not able to access the uploaded file: unexpected EOF 2017/05/30 20:19:28 W

我对Golang完全陌生。我正在尝试将文件从客户端发送到服务器。客户机应该将其分割成更小的块,并将其发送到服务器公开的rest端点。服务器应该组合这些块并保存它

这是我到目前为止所写的最新版本和代码。当我运行这个程序来复制一个大小为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

您将缓冲区和文件划分为单独的块,并将它们作为单独的HTTP消息发送。这不是
multipart
的使用方式

multipart
MIME表示单个HTTP消息可能包含一个或多个实体,引用:

MIME提供了许多“多部分”类型——对 单个消息正文中的一个或多个实体。所有多部分类型 共享RFC 2046第5.1.1节中定义的通用语法


您应该发送整个文件并在单个HTTP消息中发送(文件内容应该是单个实体)。HTTP协议将负责其余部分,但是如果您打算传输的文件很大(例如<>代码> 2GB</代码>),您可以考虑使用FTP。p> 如果您使用的是多部分/表单数据,那么它将获取整个文件并将其作为单字节流发送。Go可以通过这种方式轻松处理数十亿字节的文件。但是,您的代码需要在这方面保持智能

  • ioutil.ReadAll(r.Body)
    是不可能的,除非您确定该文件将非常小。请不要这样做
  • multipartReader,err:=r.multipartReader()
    使用多部分读取器。这将按照编码中包含的顺序在上传文件时迭代。这一点很重要,因为您可以将文件完全保留在内存之外,并将
    从一个文件句柄复制到另一个文件句柄。这就是如何轻松处理大型文件
  • 您将遇到中间框和反向代理的问题。我们必须更改Nginx中的默认值,这样它就不会切断大文件。Nginx(或者您可能使用的任何反向代理)将需要合作,因为它们通常会默认为一些非常小的文件大小,比如300MB
  • 即使您认为您在上传时使用了一些文件部分技巧来处理这个问题,您也需要在下载时处理大文件。Go可以通过从filehandle到filehandle进行
    复制
    ,非常高效地处理单个大文件。如果您想要下载上传的文件时获得更好的性能,那么最终还需要支持部分内容(http 206)和未修改内容(304)。当涉及大型视频等内容时,一些浏览器会忽略您不要求提供部分内容的请求。因此,如果您不支持此功能,则某些内容将无法下载

如果您想使用一些技巧来分割文件并将其分部分发送,那么最终需要使用特定的Javascript库。如果您要从任何客户机对Go服务器进行编程访问,这将对互操作性造成很大的危害。但是,也许你不能修复中间框的大小限制,你真的想把文件切成块。您将有大量的工作来处理下载您设法分块上传的文件。

您试图做的是使用tcp连接与大多数其他语言编写的典型代码,在GO中,您也可以将tcp与net.Listen一起使用,并最终在listener对象上接受。那么这应该没问题。

我认为表单数据不是任意二进制数据的正确内容类型。我认为应该是应用程序/八位字节流。看看如果我发送一个大文件,它会作为一个HTTP请求发送吗?