通过代理处理从Backbone.js到基于Rails的API的文件上传的最佳方法?

时间:2012-07-22 13:38:46

标签: file-upload backbone.js proxy nginx rack

我们有一个Backbone.js应用程序,支持使用plupload上传文件。上传通过代理(机架反向代理,但很快转换为直接nginx)通过API发送到单独的Rails应用程序。

这个API已经使用了很长时间,可以处理数百MB的上传。我们认为这不是问题所在。

然而,当通过BB.js和代理执行上传时,它们可以在不同的点停止,但主要是在1.5MB以下。

值得注意的是,在相同的情况下,尝试上传少于1MB的多个文件的工作正常。我可以上传100个1MB文件,但我无法上传任何文件,比如2MB。

我们从BB.js应用程序获得的一些例外是:

  • 未捕获的SyntaxError:意外的输入结束
  • SyntaxError:JSON解析错误:意外的EOF

最好的方法是什么?主要的罪魁祸首似乎是一个较慢的网络连接(通过基于光纤的家庭网络上传到服务器往往完成,而在工作中通过DSL线路上传往往会失败),但我无法想象这是切断和干燥

是我们的代理设置吗?切换到nginx会解决这个问题吗?为此目的设置nginx的最佳方法是什么?

编辑回答Maurício的评论:

服务器没有返回任何内容。以下是WebKit Network Inspector报告的标题(主机名已更改):

Request URL:http://our.site.com/api/files
Request Headersview source
Content-Length:131661475
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryHwVBiFW8AIuh18Bt
DNT:1
Origin:http://our.site.com
Referer:http://our.site.com/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2
Request Payload
------WebKitFormBoundaryHwVBiFW8AIuh18Bt
Content-Disposition: form-data; name="name"

861-railsconf2012-using-backbone-js-with-rails-patterns-from-the-wild-large.mp4.mpg
------WebKitFormBoundaryHwVBiFW8AIuh18Bt
Content-Disposition: form-data; name="file_entry[folder_id]"

32984
------WebKitFormBoundaryHwVBiFW8AIuh18Bt
Content-Disposition: form-data; name="file"; filename="861-railsconf2012-using-backbone-js-with-rails-patterns-from-the-wild-large.mp4.mpg"
Content-Type: video/mpeg


------WebKitFormBoundaryHwVBiFW8AIuh18Bt--

之后,没有回应。检查员将状态和时间报告为待定。在这个最近的情况下,传输大小为0B,虽然我知道数据已发送,因为我可以监视输出流量达到900K /秒,可能持续10-15秒,然后再次恢复正常(1-2K /秒)。

1 个答案:

答案 0 :(得分:0)

这一切都归结为nginx配置。尚未设置client_max_body_size指令。默认值为1M。增加这似乎已经解决了这个问题。

client_max_body_size(http://wiki.nginx.org/HttpCoreModule#client_max_body_size)的nginx wiki条目声明:

“应该注意的是,网络浏览器通常不知道如何正确显示这样的HTTP错误。”

我还没有检查Chrome和Safari如何处理413返回代码,但这可能解释了为什么我似乎没有得到服务器的响应。