gpt4 book ai didi

ruby-on-rails - 验证失败 : Upload file has an extension that does not match its contents

转载 作者:数据小太阳 更新时间:2023-10-29 06:41:23 31 4
gpt4 key购买 nike

我正在使用回形针 gem 上传文件。我的回形针 gem 版本是 paperclip-4.1.1。上传文件时抛出

Validation failed: Upload file has an extension that does not match its contents.

我正在尝试上传 xlsx 文件。而且我已经在模型 content_type 中提到了这一点。

 validates_attachment_content_type :upload_file, :content_type => %w(application/msword application/vnd.ms-office application/vnd.ms-excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet),
:message => ', Only XML,EXCEL files are allowed. '

我不知道为什么会出现这个错误。如果您对此错误有任何想法,请分享。

日志摘录显示验证失败:

Command :: file -b --mime-type '/tmp/5249540099071db4e41e119388e9dd6220140513-24023-1jlg4zy' [paperclip] Content Type Spoof: Filename file_for_bulk_upload1.xlsx (["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"]), content type discovered from file command: . See documentation to allow this combination. 
Command :: file -b --mime-type '/tmp/6f19a4f96154ef7ce65db1d585abdb2820140513-24023-tt4u1e' [paperclip] Content Type Spoof: Filename file_for_bulk_upload1.xlsx (["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"]), content type discovered from file command:

最佳答案

Paperclip 欺骗验证检查失败,因为 file命令无法准确确定文件类型。

在你的日志中content type discovered from file command: . - 句点前的空格是输出的结果 - 即空白。然而,比较的另一面纯粹使用被正确拾取为 excel 文件的文件扩展名。因此您的验证失败。

当前版本的 Paperclip 使用的是 file -b --mime-type确定文件,但是--mime-type并非所有实现都支持。使用 --mime 有一个变化相反,但它还没有达到里程碑。

我认为您有一些选择。您选择哪一个取决于您对一些不可靠的文件被上传并被称为 excel 文件的担心程度。如果您担心这一点,请尝试选项 1;如果您不担心,请选择选项 2 或 3。

1) 覆盖欺骗检查以使用 --mime而不是 --mime-type .

覆盖type_from_file_command在初始化程序中:

module Paperclip
class MediaTypeSpoofDetector
private

def type_from_file_command
# -- original code removed --
# begin
# Paperclip.run("file", "-b --mime-type :file", :file => @file.path)
# rescue Cocaine::CommandLineError
# ""
# end

# -- new code follows --
begin
Paperclip.run("file", "-b --mime :file", :file => @file.path)
rescue Cocaine::CommandLineError
""
end
end
end
end

2) 绕过 file通过完全根据文件扩展名设置文件类型进行检查。

将此 Paperclip 选项设置在应用程序初始化期间读取的某个位置(例如 config/application.rbconfig/environments/<environment>.rbconfig/initializers/paperclip.rb):

Paperclip.options[:content_type_mappings] = { xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }

3) 完全禁用欺骗。

通过在初始化程序中创建类似这样的内容来覆盖欺骗检查:

module Paperclip
class MediaTypeSpoofDetector
def spoofed?
false
end
end
end

更新:

您在模型中进行的验证不是导致此问题的原因。这会验证您可以加载哪些类型的文件;您看到的是回形针计算文件类型有效但其内容与文件类型不匹配。

假设您可以使欺骗验证正常工作,那么您的内容验证存在一个异常。您输出的错误消息说“只允许使用 XML、EXCEL 文件”,但是您的实际验证是检查 MS word 和 excel 文件,而不是 xml。

如果您的消息是正确的并且您确实只想允许 xml 和 excel 文件,您应该将 content_type 验证更改为:

validates_attachment_content_type :upload_file, :content_type => %w(application/xml application/vnd.ms-excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet),
:message => ', Only XML,EXCEL files are allowed. '

关于ruby-on-rails - 验证失败 : Upload file has an extension that does not match its contents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23629888/

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