3

我有一个 Rails 应用程序,它允许用户上传视频(在本地,而不是云服务器上)。

我正在使用 Paperclip 3.1.4 和 Paperclip-ffmpeg 0.9.0。

一切正常,花花公子,但问题是,如果用户以错误的格式上传文件,或者大于验证规则允许的大小,则在上传完成之前不会显示错误消息 - 不是非常适合可用性,特别是如果上传错误格式的文件需要 10 分钟!

那么,有什么方法可以将jQuery(我承认对它知之甚少)集成到我的模型中,以便用户点击“上传”按钮时可以检查文件,而不是等到应用程序尝试上传文件(如果有意义的话)?

这是我模型中的一些代码(我已经去掉了不重要的东西):

class Video

     attr_accessible :sourcefile

     has_attached_file :sourcefile

     ...

     validates_attachment_size :sourcefile, :less_than => 250.megabytes, 
        :message => "Sorry, your video is too large"
     validates_attachment_content_type :sourcefile, :content_type => [...],
        :message => "Sorry, the file format is wrong"

end

那么,有没有什么办法可以“固定”一个函数来触发某种形式的 JavaScript 在文件上传之前检查文件,并且这些验证规则会生效(我希望避免用户是否在他们的浏览器中禁用了 JavaScript)?

如果文件类型正确,如果我可以使用另一个函数来触发 jQuery 式进度条,那也很好,但在这个阶段不一定需要这样做。

谢谢!

编辑 -感谢下面的 Kevin B,他指出 jQuery/JavaScript 不能用于检查文件大小。那好吧!我还有其他方法可以采取吗?服务器正在运行 nginx,但我宁愿不去那里 - 我更愿意在 Rails 代码本身中处理这个问题。

4

1 回答 1

1

您可以在 nginx 中配置任何请求的最大大小,然后让您的 jQuery 代码响应 413 状态码,如果文件太大,nginx 将返回该状态码。Nginx 应该能够在看到请求头时立即拒绝它,而不是让用户上传整个文件;无论好坏,您的 Rails 应用程序都不会看到这些请求。

在站点的 nginx 配置中,您需要设置:

client_max_body_size 250M;

在您的 jQuery 中,您可以指定在请求失败时调用的错误回调。在那个回调中,我使用了这样的东西:

    if (responseText.responseText.match(/413 Request Entity Too Large/)) {
        error_message = "Files cannot be more than 250 MB.";
    }

之后,您只需要获取用户可以看到的 error_message 即可。无论是否打开 javascript,此方法都可以将过大的文件从您的服务器中移除,但如果启用了 JS,它们可以获得更好的反馈。值得一提的是,我正在使用 jQuery 表单插件来伪造 AJAX 文件上传,但如果你愿意,还有其他方法可以做到这一点。

于 2013-04-04T16:13:07.437 回答