12

ファイルのアップロードには、Rails 3.2、Paperclip(3.0.4)、aws-sdk(1.5.2)、jQuery-File-Uploadを使用しています。

問題は、(pptx)のようなオフィスファイルがpptxファイルではなくzipファイルとしてダウンロードされていることです。これが私がログに見るものです:

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") 

ファイルがpptxとしてどのように受信されるかに注意してください。ただし、AWS S3にアップロードすると、zipファイルとして送信されます。

4

6 に答える 6

15

MIMEタイプが登録されていないようです。

x(Office 2007+)で終わるOfficeファイルは、実際にはzip形式のXMLファイルです通常のMIMEタイプを使用するものはすべて、zipファイルと見なされます。

Office2007以降のファイルの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タイプ、PaperclipとRailsを使用したdocxファイルのアップロード、およびRailsの動的Word(.docx)ドキュメントも読むことができます。

于 2012-06-02T04:55:32.313 に答える
11

Marc Bが最初に示唆したように、最後に終わるすべてのOfficeドキュメントxは実際にzip形式のXMLファイルであることがわかりました。通常のmimetypeを使用するものはすべて、zipファイルであると見なされます。

これを回避するには、Officemimetypesをサーバーに登録する必要があります。したがって、.pptxファイルの場合は

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

config / initializers/mime_types.rbファイルにあります。

または、すべてのOffice 2007ファイルをサポートする必要がある場合は、このStackoverflowの回答Rack::Mime::MIME_TYPES.merge!()で実際に見られる方法を使用できます。

于 2012-06-01T02:04:50.343 に答える
3

ログのCommand :: file -b --mime '/var/folders ...一部は、Paperclipが経由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、ペーパークリップ内でコンソール内とは異なる動作をしていることを示しているようです。

ジェムの関連部分を(デバッガーを介して、またはローカルコピーにいくつかのプリントをスローして)インストルメントして、何が表示されているかを確認できますか?また、コントローラーが取得するパラメーターをアタッチメントオブジェクトに変換する方法について、もう少し詳しく教えてください。

于 2012-06-03T21:27:24.253 に答える
3

Office形式の「x」バージョンはzipファイルです-zip形式のxml。そのため、mimeタイプに基づいてファイル拡張子を決定するものはすべて、常にそれらをzipファイルとして認識します。

于 2012-05-30T01:04:39.043 に答える
3

2019年現在、受け入れられているソリューションは機能しません。

ここにある解決策を参照して、次のコードを使用して'emを.docxとしてダウンロードしました。

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

単に要求することも機能'mimemagic/overlay'initializers/mimemagic.rbなかったことに注意してください。手動でmimetypeを追加する必要がありました。

修正前にアップロードされたファイルに取り組むために、私は単にそれらをs3に再アップロードしました。

于 2019-09-12T13:56:07.183 に答える
2

これがまだ機能していないことに気付いた人のために、Paperclipの新しいバージョンでmimemagicは.にgem依存関係がありPaperclip::ContentTypeDetectorます。mimeタイプをそれに登録する必要があります。

于 2016-08-05T19:12:10.013 に答える