10

estoy usando lo siguiente para la carga de archivos: Carriles 3.2, Paperclip (3.0.4), AWS-SDK (1.5.2) & jQuery-File-SubirLas subidas de clips de documentos de Office (docx, pptx) se están descargando como archivos zip?

El problema es que los archivos de oficina como (pp) están siendo descargado como archivos zip no archivos pptx. Esto es lo que veo en los registros:

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

Aviso cómo el archivo viene como pptx, pero cuando se envían a AWS S3 va como un archivo zip?

+0

¿Alguien más ve esto? – AnApprentice

+0

¿qué pasa con 'ppt' –

Respuesta

10

Resulta que, como Marc B insinuó por primera vez - que todos los documentos de Office que terminan en x son, de hecho, archivos XML comprimidos. Cualquier cosa que use mimetypes normales asumirá que es un archivo comprimido.

Para evitar esto, tiene que register the Office mimetypes with your server. Por lo tanto, para sus archivos .pptx, se pone

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

en la configuración del archivo de inicializadores// mime_types.rb.

Como alternativa, puede usar el método Rack::Mime::MIME_TYPES.merge!(), que se ve en acción en this Stackoverflow answer, si tiene que admitir todos los archivos de Office 2007.

+1

Gracias, pero agregar la línea a config/initializers/mime_types.rb no tiene ningún efecto, incluso después de reiniciar. ¿Por qué sería eso? – AnApprentice

+0

También agregando Rack :: Mime :: MIME_TYPES.merge! ({ ".pptx" => "aplicación/presentación" }) no tuvo ningún efecto, no hubo cambios. Ideas? – AnApprentice

+0

Lo curioso es que en S3 veo el archivo con la extensión correcta, PPTX. Es cuando tengo que obtener el archivo que se convierte en un ZIP. Tal vez ese es el problema? Esto es lo que uso para obtener el archivo para la descarga de S3 en mi modelo de archivo adjunto: attachment.s3_object (style) .url_for (: read,: secure => true,: expires => expires_in) .to_s – AnApprentice

3

Las versiones 'x' de los formatos de Office SON archivos zip - zip xml. Como tal, cualquier cosa que determine extensiones de archivos basadas en tipos de mime siempre los verá como archivos zip.

+0

Gracias Marc, entonces, ¿cómo/dónde manejarlo para asegurarse de que se descarguen con el archivo correcto ext (pptx vs zip)? Gracias – AnApprentice

+0

No sé nada sobre paperclip/ruby, pero tienes el nombre de archivo original en tu fragmento de arriba - Sugiero almacenar eso con el resto de las cosas yendo a la base de datos, y usarlo para la descarga más adelante . –

12

Parece que no tiene registrados tipos MIME. archivos

Oficina que terminan en x (Oficina 2007+) son de hecho archivos XML comprimidos. Cualquier cosa que use tipos MIME normales lo asumirá como un archivo comprimido.

tipos MIME para la oficina 2007+ archivos

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

En el archivo config/initializers/mime_types.rb, agregue el campo obligatorio, al igual que el siguiente ejemplo;

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

Irónicamente, IE puede tener dificultades para reconocer los nuevos archivos de MS Office, mientras que otros navegadores los reconocen bien.

Para que IE funcione con estos archivos, debe agregar los tipos mime a la configuración del servidor. En Rails esto se hace en 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 

Si su aplicación es aproximado a través de Apache y Apache sirve sus activos estáticos que también tendrá que configurar Apache con los nuevos tipos MIME (y reiniciar) según http://bignosebird.com/apache/a1.shtml

Por lo general, los tipos de mime se ubicaban en /etc/mime.types, pero prueba locate mime.types si no estás seguro.

Puede consultar paperclip adapters.

Usted puede leer 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 y Dynamic Word (.docx) Documents in Rails también.

+0

Debe eliminar las referencias del Administrador de IIS de esta respuesta, ya que no tienen relación con Rails. –

+0

gracias @MarkRichman ... Me perdí eso ... :) –

+0

De nada. He votado a favor su respuesta. –

3

La parte Command :: file -b --mime '/var/folders ... de su registro significa que Paperclip no está detectando el tipo de mimo a través de MIME::Types.type_for y está retrocediendo en el comando file.

código relevante aquí: https://github.com/thoughtbot/paperclip/blob/5bf0619fe79ffbcaf8f0d8a7aca88b5685aec4b3/lib/paperclip/io_adapters/file_adapter.rb#L16

y aquí: https://github.com/thoughtbot/paperclip/blob/5bf0619fe79ffbcaf8f0d8a7aca88b5685aec4b3/lib/paperclip/io_adapters/file_adapter.rb#L71

El comando file se ejecuta en el archivo de extensión-menos temporal y calcula que es un archivo ZIP, ya que, como otros han señalado, lo que realmente es.

El hecho de que MIME::Types.type_for("test1.pptx") funciona correctamente para que en la consola parece indicar que, o bien original_filename es raro en esa parte del código o MIME::Types.type_for se comporta de manera diferente dentro de un clip que en la consola.

¿Se puede instrumentar la parte relevante de la gema (a través de depurador o tirar algunas copias en su copia local) para ver lo que está viendo? Además, ¿puede proporcionar más detalles sobre cómo está convirtiendo los parámetros que su controlador obtiene en los objetos adjuntos?

0

Para aquellos que encuentran esto todavía no funciona, las versiones más nuevas de Paperclip tienen la dependencia mimemagic gem en el Paperclip::ContentTypeDetector. Querrá registrar los tipos de mime con eso.

Cuestiones relacionadas