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

AnA*_*ice 11 ruby-on-rails amazon-s3 paperclip mime-types ruby-on-rails-3

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

问题是像(pptx)这样的office文件被下载为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\"\r\nContent-Type: application/vnd.openxmlformats-officedocument.presentationml.presentation\r\n", @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") 
Run Code Online (Sandbox Code Playgroud)

请注意文件如何作为pptx进入,但是当上传到AWS S3时作为zip文件?

bla*_*d Ψ 14

好像你没有注册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|
Run Code Online (Sandbox Code Playgroud)

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

"application/vnd.openxmlformats-officedocument.presentationml.presentation", :pptx
Run Code Online (Sandbox Code Playgroud)

具有讽刺意味的是,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
Run Code Online (Sandbox Code Playgroud)

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

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

您可以参考回形针适配器.

你可以阅读为MimeMap属性和在IIS中的脚本映射属性的默认设置描述,Office 2007的MIME类型为Apache,上传docx文件用回形针和Rails用Rails动态的Word文件(.docx)文件也.


Mak*_*oto 11

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

要解决此问题,您必须在服务器注册Office mimetypes.所以,对于你的.pptx文件,你放了

Mime::Type.register "application/vnd.openxmlformats-officedocument.presentationml.presentation", :pptx
Run Code Online (Sandbox Code Playgroud)

在config/initializers/mime_types.rb文件中.

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