【问题标题】:Best way to handle file uploads from Backbone.js to Rails-based API through a proxy?通过代理处理从 Backbone.js 到基于 Rails 的 API 的文件上传的最佳方式?
【发布时间】:2012-07-20 23:49:32
【问题描述】:

我们有一个支持使用 plupload 上传文件的 Backbone.js 应用程序。上传通过代理(目前是 rack-reverse-proxy,但很快切换到直接 nginx)通过 API 发送到单独的 Rails 应用程序。

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

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

值得注意的是,在相同的情况下,尝试上传多个小于 1MB 的文件都可以正常工作。我可以上传 100 个 1MB 的文件,但不能上传超过 2MB 的文件。

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

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

解决这个问题的最佳方法是什么?罪魁祸首似乎是网络连接速度较慢(通过基于光纤的家庭网络上传到服务器往往会完成,而在工作中通过 DSL 线路上传往往会失败),但我无法想象它是那么简单.

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

编辑回答毛里西奥的评论:

服务器没有返回任何内容。以下是 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/秒)。

【问题讨论】:

  • 浏览器接收到的输出是什么?您是否使用 CURL 或类似的方法进行相同的调用并查看它是否通过代理工作?
  • 毛里西奥,我已经添加了详细信息。如果您需要更多信息,请告诉我。

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


【解决方案1】:

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

client_max_body_size (http://wiki.nginx.org/HttpCoreModule#client_max_body_size) 的 nginx wiki 条目指出:

“需要注意的是,Web 浏览器通常不知道如何正确显示这样的 HTTP 错误。”

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

【讨论】:

    猜你喜欢
    • 2010-09-26
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多