2013-04-04 48 views
2

我有一个Rails应用程序,允许用户上传视频(在本地而不是云端服务器上)。使用Paperclip和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

jQuery没有任何东西可以让你在上传之前检查文件的文件大小或文件类型,而且并非所有的浏览器都可以在使用flash之外进行检查。 – 2013-04-04 14:08:39

+0

谢谢凯文。我会深入挖掘替代解决方案,如果发现任何问题,请在此处发布我的结果。 – Graeme 2013-04-04 14:29:10

+0

好吧,你可以用javascript来做到这一点,它并不是所有的浏览器都支持。以下是一个包​​含一些示例的页面:https://developer.mozilla.org/en-US/docs/DOM/FileList – 2013-04-04 14:51:02

回答

1

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

在你的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文件上传,但如果需要,还有其他方法可以做到这一点。

+0

这听起来像一个很好的解决方案,我会看看并报告回来! – Graeme 2013-04-05 10:13:58

+0

我们如何验证文件类型为视频?我认为上述仅适用于文件大小 – Sam 2013-11-20 05:52:13

相关问题