【问题标题】:Checking file size/type before upload using Paperclip and Rails在使用 Paperclip 和 Rails 上传之前检查文件大小/类型
【发布时间】:2013-04-04 14:06:17
【问题描述】:

我有一个 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 代码本身中处理问题。

【问题讨论】:

  • jQuery 没有任何东西可以让您在上传之前检查文件的文件大小或文件类型,而且除了使用 flash 时,并非所有浏览器都允许这样做。
  • 谢谢凯文。我会更深入地寻找替代解决方案,如果发现任何问题,我会在此处发布我的结果。
  • 好吧,你可以用javascript来做,只是不是所有的浏览器都支持。这是一个包含一些示例的页面:developer.mozilla.org/en-US/docs/DOM/FileList

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


【解决方案1】:

你可以在nginx中配置any请求的最大大小,然后让你的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 文件上传,但如果您愿意,还有其他方法可以做到这一点。

【讨论】:

  • 这听起来是一个很好的解决方案,我会看看并报告!
  • 我们如何验证文件类型为视频?我认为以上仅适用于文件大小
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 2012-06-23
  • 2015-06-28
  • 1970-01-01
相关资源
最近更新 更多