10

Sto utilizzando il seguente per il caricamento di file: Rails 3.2, Paperclip (3.0.4), AWS-sdk (1.5.2) & jQuery-File-UploadI caricamenti di graffette per file office (docx, pptx) vengono scaricati come file zip?

Il problema è che i file di Office come (pptx) stanno essendo scaricato come file zip non file pptx. Ecco quello che vedo nei log:

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

Notate come il file arriva come PPTX, ma quando caricato AWS S3 va come un file zip?

+0

Qualcun altro lo vede? – AnApprentice

+0

che dire di 'ppt' –

risposta

10

Si scopre, come Marc B ha inizialmente accennato, che tutti i documenti di Office che terminano in x sono in realtà file XML compressi. Qualunque cosa utilizzi i normali tipi di mimo assumerà che si tratti di un file zippato.

Per aggirare questo, è necessario register the Office mimetypes with your server. Così, per i file .pptx, si mette

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

in config/inizializzatori/file di mime_types.rb.

In alternativa, è possibile utilizzare il metodo Rack::Mime::MIME_TYPES.merge!(), visibile in azione in this Stackoverflow answer, se è necessario supportare tutti i file di Office 2007.

+1

Grazie, ma l'aggiunta della riga a config/initializers/mime_types.rb non ha alcun effetto, anche dopo il riavvio. Perché dovrebbe essere? – AnApprentice

+0

Anche l'aggiunta di Rack :: Mime :: MIME_TYPES.merge! ({ ".pptx" => "application/presentation" }) non ha avuto alcun effetto, nessuna modifica. Idee? – AnApprentice

+0

La cosa divertente qui è che in S3 vedo il file con l'estensione corretta, PPTX. È quando ho avuto modo di ottenere il file che si trasforma in un ZIP. Forse questo è il problema? Questo è quello che uso per ottenere il file per il download S3 nel mio modello di allegato: attachment.s3_object (style) .url_for (: read,: secure => true,: expires => expires_in) .to_s – AnApprentice

3

Le versioni "x" dei formati Office SONO file zip - xml compressi. In quanto tale, tutto ciò che determina estensioni di file basate su tipi di mime li vedrà sempre come file zip.

+0

Grazie Marc, quindi come/dove gestire l'utente assicurandosi che vengano scaricati con il file corretto ext (pptx vs zip)? Grazie – AnApprentice

+0

Non sai nulla di paperclip/ruby, ma hai il nome file originale nel tuo frammento di codice qui sopra - Suggerirei di archiviarlo con il resto del materiale che entra nel database e usarlo per il download in un secondo momento . –

12

Sembra che tu non abbia registrato i tipi MIME. file

Office che fine a x (Ufficio 2007+) sono davvero file XML compressi. Tutto ciò che utilizza i tipi MIME normali lo assumerà come file zippato.

tipi MIME per ufficio 2007+ file

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

Nel file config/initializers/mime_types.rb, aggiungere il campo obbligatorio, come nell'esempio qui sotto;

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

Ironicamente IE può avere difficoltà a riconoscere i nuovi file di MS Office, mentre gli altri browser li riconosce bene.

Per poter utilizzare IE con questi file è necessario aggiungere i tipi di mime alla configurazione del server. In Rails questo è fatto in 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 

Se la vostra applicazione è proxy attraverso Apache e Apache serve le risorse statiche avrete anche configurare Apache con i nuovi tipi MIME (e si riavvia) secondo http://bignosebird.com/apache/a1.shtml

Di solito i tipi mime si trovavano in /etc/mime.types ma prova locate mime.types se non sei sicuro.

È possibile fare riferimento a paperclip adapters.

Si può leggere Description of the default settings for the MimeMap property and for the ScriptMaps property in IIS, Office 2007 MIME types for Apache, Uploading docx files with Paperclip and Rails e Dynamic Word (.docx) Documents in Rails anche.

+0

È necessario rimuovere i riferimenti di Gestione IIS da questa risposta, poiché non hanno alcun rapporto con Rails. –

+0

grazie @MarkRichman .. Mi mancava .. :) –

+0

Prego. Ho upvoted la tua risposta. –

3

La parte Command :: file -b --mime '/var/folders ... del log indica che Paperclip non riesce a rilevare il tipo mime tramite MIME::Types.type_for e sta ricadendo sul comando file.

relativo codice qui: https://github.com/thoughtbot/paperclip/blob/5bf0619fe79ffbcaf8f0d8a7aca88b5685aec4b3/lib/paperclip/io_adapters/file_adapter.rb#L16

e qui: https://github.com/thoughtbot/paperclip/blob/5bf0619fe79ffbcaf8f0d8a7aca88b5685aec4b3/lib/paperclip/io_adapters/file_adapter.rb#L71

Il comando file viene eseguito sul file di estensione-less temporanea e figure si tratta di un file ZIP, dal momento che, come altri hanno fatto notare, in realtà è.

Il fatto che MIME::Types.type_for("test1.pptx") funziona correttamente per voi nella console sembra indicare che sia original_filename è strano in quella parte del codice o MIME::Types.type_for si sta comportando in modo diverso all'interno graffetta che nella vostra console.

È possibile strumentare la parte rilevante della gemma (tramite debugger o lanciando alcune copie nella copia locale) per vedere cosa sta vedendo? Inoltre, puoi fornire ulteriori dettagli su come stai convertendo i parametri che il tuo controllore entra negli oggetti allegati?

0

Per coloro che trovano questo non funziona ancora, le versioni più recenti di Paperclip hanno la gemma mimemagic nello Paperclip::ContentTypeDetector. Ti consigliamo di registrare i tipi MIME con quello.

Problemi correlati