2011-01-05 20 views
5

Si verificano problemi durante il tentativo di pubblicare un file .docx utilizzando Php. Durante il caricamento del file rilevo il tipo di file mime e carica il file utilizzando il file con l'estensione corretta in base al tipo mime; per esempio. qui di seguito:Elaborazione di file .docx tramite Php

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

Quando si tenta di servire i file per il download, che faccio il contrario nel rilevare l'estensione e servire in base al tipo MIME per esempio

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; 
      } 
     } 

} 

Tutti i file vengono visualizzati per scaricare in modo corretto e aperto bene, ma quando si tenta di aprire un file docx, Word (su più file) genera un errore che indica il file è danneggiato.

Qualsiasi idea sarebbe grandiosa, grazie.

Modifica # 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; 

FISSO

prima di chiamare ReadFile() ho aggiunto ob_clean() e flush(), che sembra aver risolto il problema.

+2

'case ('jpg' || 'jpeg'):' non funziona, è necessario scrivere 'case 'jpg': case 'jpeg':'. – deceze

+0

La domanda simile potrebbe aiutare: http://stackoverflow.com/questions/179315/downloading-docx-from-ie-setting-mime-types-in-iis – kapa

+0

Qual è il risultato che ricevi dal lato client? È un file valido quando viene salvato su disco? – deceze

risposta

5

Risolto; prima di chiamare readfile() ho aggiunto ob_clean() e flush() che sembra aver risolto il problema.

0

Ho avuto un problema simile qualche giorno fa. Era dovuto all'uscita di alcuni caratteri poco prima che il file venisse letto. Questi caratteri sono stati inseriti all'inizio del file scaricato, facendolo sembrare danneggiato quando ho provato ad aprirlo (PDF in questo caso).

+0

Cheers ma sembra che non ci siano caratteri in uscita prima del file. Ho modificato sopra per mostrare come viene emesso il file. –