使用Paperclip和Rails在上载之前检查文件大小/类型

时间:2013-04-04 14:06:17

标签: jquery ruby-on-rails paperclip-validation

我有一个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-esque进度条,这也不错,但在这个阶段不一定需要。

谢谢!

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

1 个答案:

答案 0 :(得分: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文件上传,但如果你愿意,还有其他方法可以做到这一点。