gpt4 book ai didi

jquery - 使用 Paperclip 和 Rails 上传之前检查文件大小/类型

转载 作者:行者123 更新时间:2023-12-01 01:35:14 25 4
gpt4 key购买 nike

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

最佳答案

您可以在 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,它们可以获得更好的反馈。就其值(value)而言,我使用 jQuery 表单插件来伪造 AJAX 文件上传,但如果您愿意,也可以使用其他方法来实现这一点。

关于jquery - 使用 Paperclip 和 Rails 上传之前检查文件大小/类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15813564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com