是否可以在不等待整个表单到达的情况下访问通过 multipart/form-data 发送的参数
Is it possible to access parameters sent via multipart/form-data without waiting for the entire form to arrive
我有一个相当大的视频文件,我通过 multipart/form-data 上传到网络服务。
大约需要 30 秒才能到达,我不想等那么久只是为了访问我随文件发送的参数。
我的问题很简单,我可以访问随表单发送的参数而无需等待上传视频负载吗?
可以使用 headers 或任何其他方法来完成吗?
流与缓冲
这是关于如何设置网络服务器的。对于 IIS,您可以启用 Streaming。
否则,默认情况下,IIS 将使用 'buffering' - 在 IIS 中的应用程序 运行 可以获取之前,整个请求首先加载到内存中(您无法访问的 IIS 内存)它。
没有使用 IIS?你必须弄清楚如何让网络服务器做同样的事情。
如何使用 IIS 进行流式传输:
Streaming large file uploads to ASP.NET MVC
注意内循环读取文件的方式:
while ((cbRead = clientRequest.InputStream.Read(rgbBody, 0, rgbBody.Length)) > 0)
{
fileStream.Write(rgbBody, 0, cbRead);
}
这里不是像那个问题那样只保存数据,你将不得不解析任何 xml/json/etc 或任何包含你所说的文件参数的东西......然后期望视频被发送。如果这是一个快速过程,您可以立即处理它们……然后获取视频的其余部分……或者您可以将它们发送到后台线程。
您可能无法解析它只是将您拥有的内容转储到 json 或 xml 解析器,顶部会有一个未闭合的标记或 }关闭直到视频数据上传后(无论如何完成)。或者,如果它是来自表单提交的多部分数据,正如您所暗示的,您将不得不自己解析部分上传,而不是仅仅向 IIS 询问 post 数据。
所以这会很棘手,您可以首先将 1k 一次写入带有时间戳的日志文件,以 证明 您正在获取数据来了。之后就是编码问题了。
让它工作还意味着您必须对客户端及其发送数据的方式有一些控制。
那是因为您至少必须确保它首先发送文件参数!
这让我很担心,因为如果您可以控制客户端,为什么不能采用简单的方式(如 Nobody 和 Nkosi 所暗示的那样)并使用 2 个请求?你提到你需要一个。为什么不编写 js 客户端代码首先在 XHR 中发送参数,然后在第二个请求中发送文件,在两者中使用相关 ID 将它们绑定在一起? (服务器可以从第一个请求中 return 这个,你可以在第二个请求中发送它)。
显然,如果您只有一个包含一些输入和文件上传并提交的表单,那么您需要一个请求 ;-) 但是如果您可以控制客户端,您就不会受困于此.
祝你好运,这里有一些高级编程,但没有什么超高科技。你会成功的!!!
如果您无法控制服务器代码,您可能被卡住了,如果服务器应用程序的网络服务器正在缓冲,服务器应用程序将无法获得任何东西,当然,如果您想先对文件参数做些什么,这实际上意味着您可以控制服务器端 ;-)
我有一个相当大的视频文件,我通过 multipart/form-data 上传到网络服务。 大约需要 30 秒才能到达,我不想等那么久只是为了访问我随文件发送的参数。
我的问题很简单,我可以访问随表单发送的参数而无需等待上传视频负载吗?
可以使用 headers 或任何其他方法来完成吗?
流与缓冲
这是关于如何设置网络服务器的。对于 IIS,您可以启用 Streaming。
否则,默认情况下,IIS 将使用 'buffering' - 在 IIS 中的应用程序 运行 可以获取之前,整个请求首先加载到内存中(您无法访问的 IIS 内存)它。
没有使用 IIS?你必须弄清楚如何让网络服务器做同样的事情。
如何使用 IIS 进行流式传输:
Streaming large file uploads to ASP.NET MVC
注意内循环读取文件的方式:
while ((cbRead = clientRequest.InputStream.Read(rgbBody, 0, rgbBody.Length)) > 0)
{
fileStream.Write(rgbBody, 0, cbRead);
}
这里不是像那个问题那样只保存数据,你将不得不解析任何 xml/json/etc 或任何包含你所说的文件参数的东西......然后期望视频被发送。如果这是一个快速过程,您可以立即处理它们……然后获取视频的其余部分……或者您可以将它们发送到后台线程。
您可能无法解析它只是将您拥有的内容转储到 json 或 xml 解析器,顶部会有一个未闭合的标记或 }关闭直到视频数据上传后(无论如何完成)。或者,如果它是来自表单提交的多部分数据,正如您所暗示的,您将不得不自己解析部分上传,而不是仅仅向 IIS 询问 post 数据。
所以这会很棘手,您可以首先将 1k 一次写入带有时间戳的日志文件,以 证明 您正在获取数据来了。之后就是编码问题了。
让它工作还意味着您必须对客户端及其发送数据的方式有一些控制。
那是因为您至少必须确保它首先发送文件参数!
这让我很担心,因为如果您可以控制客户端,为什么不能采用简单的方式(如 Nobody 和 Nkosi 所暗示的那样)并使用 2 个请求?你提到你需要一个。为什么不编写 js 客户端代码首先在 XHR 中发送参数,然后在第二个请求中发送文件,在两者中使用相关 ID 将它们绑定在一起? (服务器可以从第一个请求中 return 这个,你可以在第二个请求中发送它)。
显然,如果您只有一个包含一些输入和文件上传并提交的表单,那么您需要一个请求 ;-) 但是如果您可以控制客户端,您就不会受困于此.
祝你好运,这里有一些高级编程,但没有什么超高科技。你会成功的!!!
如果您无法控制服务器代码,您可能被卡住了,如果服务器应用程序的网络服务器正在缓冲,服务器应用程序将无法获得任何东西,当然,如果您想先对文件参数做些什么,这实际上意味着您可以控制服务器端 ;-)