2011-01-05 22 views
5

Tengo problemas cuando intento servir un archivo .docx usando Php. Al cargar el archivo, detecto el tipo de archivo mime y cargo el archivo con la extensión correcta basada en el tipo mime; p.ej. a continuación:Sirviendo archivos .docx a través de Php

application/msword - doc 
application/vnd.openxmlformats-officedocument.wordprocessingml.document - docx 

Cuando se trata de servir a los archivos para su descarga, lo hago al revés en la detección de la extensión y el servicio basado en el tipo MIME, por ejemplo,

public static function fileMimeType($extention) { 

     if(!is_null($extention)) { 
      switch($extention) { 
       case 'txt': 
        return 'text/plain'; 
        break; 
       case 'odt': 
        return 'application/vnd.oasis.opendocument.text'; 
        break; 
       case 'doc': 
        return 'application/msword'; 
        break; 
       case 'docx': 
        return 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'; 
        break; 
       case 'jpg': 
        return 'image/jpeg'; 
        break; 
       case 'png': 
        return 'image/png'; 
        break; 
       case 'pdf': 
        return 'application/pdf'; 
        break; 
       default: 
        break; 
      } 
     } 

} 

Todos los archivos para descargar aparecen correctamente y abierto bien, pero al intentar abrir un archivo docx, Word (en varios archivos) lanza un error que indica el archivo está dañado.

Cualquier idea sería genial, gracias.

Edición # 1

try { 

$file = new Booking_Document((int)$get_data['bookingDocument']); 
header('Content-Type: ' . Booking_Document::fileMimeType($file->getDocumentType())); 
header('Content-Disposition: attachment; filename=' . $file); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: public'); 
echo readfile(Zend_Registry::get(static::$_uploadDir).$this->_id); 
} catch (Exception $e) { 
View_Helpers_FlashMessages::addMessage(array('message' => $e->getMessage(), 'type' => 'error')); 
} 
exit; 

FIJO

Antes de llamar a readfile() he añadido ob_clean() y al ras() que parece haber solucionado el problema.

+2

'case ('jpg' || 'jpeg'):' no funciona, debe escribir 'case 'jpg': case 'jpeg':'. – deceze

+0

Pregunta similar, podría ayudar: http://stackoverflow.com/questions/179315/downloading-docx-from-ie-setting-mime-types-in-iis – kapa

+0

¿Cuál es el resultado que recibe en el lado del cliente? ¿Es un archivo válido cuando se guarda en el disco? – deceze

Respuesta

5

Fijo; antes de llamar a readfile() agregué ob_clean() y flush() que parece haber solucionado el problema.

0

Tuve un problema similar hace unos días. Fue debido a que algunos caracteres se imprimieron justo antes de que se leyera el archivo. Estos caracteres se insertaron al principio del archivo descargado, lo que hace que parezca dañado cuando intenté abrirlo (PDF en este caso).

+0

Saludos, pero parece que no aparecen caracteres antes del archivo. Modifiqué arriba para mostrar cómo se genera el archivo. –

Cuestiones relacionadas