办公文件(docx,pptx)的回形针上传正在下载为zip文件



我正在使用以下内容进行文件上传:Rails 3.2,Paperclip(3.0.4),aws-sdk(1.5.2)和jQuery-File-Upload

问题是像(pptx

)这样的办公文件被下载为zip文件而不是pptx文件。这是我在日志中看到的内容:

Started POST
Processing by AttachmentsController#create as JS
  Parameters: {"files"=>[#<ActionDispatch::Http::UploadedFile:0x007fa1d5bee960 @original_filename="test1.pptx", @content_type="application/vnd.openxmlformats-officedocument.presentationml.presentation", @headers="Content-Disposition: form-data; name="files[]"; filename="test1.pptx"rnContent-Type: application/vnd.openxmlformats-officedocument.presentationml.presentationrn", @tempfile=#<File:/var/folders/rm/89l_3yt93g31p22738hqydmr0000gn/T/RackMultipart20120529-10443-1ljhigq>>]}
.....

SQL (1.4ms)  INSERT INTO "attachments" ("attachment_content_type", "attachment_file_name", "attachment_file_size", "attachment_file_title", "attachment_updated_at", "created_at", "deleted", "room_id", "pinned", "updated_at", "user_id") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING "id"  [["attachment_content_type", "application/zip"], ["attachment_file_name", "test1_1338339249.pptx"], ["attachment_file_size", 150329], ["attachment_file_title", "test1.pptx"], ["attachment_updated_at", Wed, 30 May 2012 00:54:09 UTC +00:00], ["created_at", Wed, 30 May 2012 00:54:09 UTC +00:00], ["deleted", false], ["room_id", 20], ["pinned", false], ["updated_at", Wed, 30 May 2012 00:54:09 UTC +00:00], ["user_id", 1]]
[paperclip] Saving attachments.
[paperclip] saving /development/private/rooms/20/user_uploaded_files/test1_1338339249.pptx
Command :: file -b --mime '/var/folders/rm/89l_3yt93g31p22738hqydmr0000gn/T/RackMultipart20120529-10443-1ljhigq20120529-10443-1lr2yg2'
[AWS S3 200 1.16513 0 retries] put_object(:acl=>:private,:bucket_name=>"cdn-assets-site-com",:content_type=>"application/zip",:data=>#<Paperclip::FileAdapter:0x007fa1d2540170 @target=#<File:/var/folders/rm/89l_3yt93g31p22738hqydmr0000gn/T/RackMultipart20120529-10443-1ljhigq>, @tempfile=#<File:/var/folders/rm/89l_3yt93g31p22738hqydmr0000gn/T/RackMultipart20120529-10443-1ljhigq20120529-10443-1lr2yg2>>,:key=>"development/private/rooms/20/user_uploaded_files/test1_1338339249.pptx") 

请注意文件如何以 pptx 形式出现,但在上传到 AWS S3 时会以 zip 文件的形式出现?

似乎您没有注册 MIME 类型。

x (Office 2007+) 结尾的 Office 文件确实是压缩的 XML 文件任何使用普通 MIME 类型的内容都将假定为压缩文件。

Office 2007+ 文件的 MIME 类型

| File |                             MIME type                                   |
+------+-------------------------------------------------------------------------+
|.docx |application/vnd.openxmlformats-officedocument.wordprocessingml.document  |
+------+-------------------------------------------------------------------------+
|.xlsx |application/vnd.openxmlformats-officedocument.spreadsheetml.sheet        |
+------+-------------------------------------------------------------------------+
|.pptx |application/vnd.openxmlformats-officedocument.presentationml.presentation|

config/initializers/mime_types.rb文件中,添加必填字段,如下例所示;

"application/vnd.openxmlformats-officedocument.presentationml.presentation", :pptx

具有讽刺意味的是,IE可能难以识别新的MS Office文件,而其他浏览器可以很好地识别它们。

为了让IE处理这些文件,您需要将mime类型添加到服务器配置中。在 Rails 中,这是在 config/initializers/mime_types.rb 中完成

Mime::Type.register "application/vnd.openxmlformats-officedocument.wordprocessingml.document", :docx
Mime::Type.register "application/vnd.openxmlformats-officedocument.presentationml.presentation", :pptx
Mime::Type.register "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", :xlsx

如果您的应用程序通过 Apache 代理,并且 Apache 提供您的静态资产,您还必须根据 http://bignosebird.com/apache/a1.shtml 使用新的 MIME 类型配置 apache(并重新启动)

通常 mime 类型位于/etc/mime.types 中,但如果您不确定,请尝试locate mime.types

您可以参考回形针适配器

您可以阅读 IIS 中 MimeMap 属性和 ScriptMaps 属性的默认设置说明、Apache的 Office 2007 MIME 类型、使用 Repclip 和 Rails 上传 docx 文件以及 Rails 中的动态 Word (.docx) 文档

事实证明,正如Marc B首先暗示的那样 - 所有以x结尾的Office文档确实是压缩的XML文件。 任何使用普通 mimetype 的东西都会假设它是一个压缩文件。

要解决此问题,您必须向服务器注册Office mimetypes。 因此,对于您的.pptx文件,您将

Mime::Type.register "application/vnd.openxmlformats-officedocument.presentationml.presentation", :pptx

在您的配置/初始值设定项/mime_types.rb 文件中。

或者,如果您必须支持所有 Office 2007 文件,则可以使用 Rack::Mime::MIME_TYPES.merge!() 方法,该方法在此 Stackoverflow 答案中可以看到。

Office 格式的"x"版本是 zip 文件 - 压缩的 xml。因此,根据 MIME 类型确定文件扩展名的任何内容都将始终将它们视为 zip 文件。

> 截至 2019 年,接受的解决方案不起作用。

参考此处找到的解决方案,我使用以下代码将它们下载为.docx。

[
  ['application/vnd.openxmlformats-officedocument.wordprocessingml.document', [[0, "PKx03x04", [[30, '_rels/.rels', [[0..5000, 'word/']]]]]]],
  ['application/vnd.openxmlformats-officedocument.wordprocessingml.document', [[0, "PKx03x04", [[30, 'word/']]]]]
].each do |magic|
  MimeMagic.add(magic[0], magic: magic[1])
end

请注意,简单地要求'mimemagic/overlay' initializers/mimemagic.rb也不起作用,我必须手动添加 mimetypes。

为了处理在修复之前上传的文件,我只是将它们重新上传到 s3。

日志的Command :: file -b --mime '/var/folders ...部分意味着回形针无法通过MIME::Types.type_for检测到 mime 类型,而是回退到 file 命令。

相关代码在这里:https://github.com/thoughtbot/paperclip/blob/5bf0619fe79ffbcaf8f0d8a7aca88b5685aec4b3/lib/paperclip/io_adapters/file_adapter.rb#L16

在这里: https://github.com/thoughtbot/paperclip/blob/5bf0619fe79ffbcaf8f0d8a7aca88b5685aec4b3/lib/paperclip/io_adapters/file_adapter.rb#L71

file命令在无扩展名的临时文件上运行,并认为它是一个ZIP文件,因为正如其他人指出的那样,它确实如此。

MIME::Types.type_for("test1.pptx")在控制台中为您正常工作的事实似乎表明original_filename在代码的那部分很奇怪,或者MIME::Types.type_for回形针中的行为与在控制台中的行为不同。

您能否检测 gem 的相关部分(通过调试器或在本地副本中抛出一些打印)以查看它所看到的内容?另外,您能否提供有关如何将控制器获取的参数转换为附件对象的更多详细信息?

对于那些

发现这仍然不起作用的人,较新版本的回形针在Paperclip::ContentTypeDetector中具有mimemagic的宝石依赖性。您需要注册 MIME 类型。

相关内容

  • 没有找到相关文章

最新更新