2011-01-05 8 views
5

Phpを使用して.docxファイルを提供しようとすると問題が発生します。ファイルをアップロードするときに、ファイルのMIMEタイプを検出し、MIMEタイプに基づいて適切な拡張子を持つファイルを使用してファイルをアップロードします。例えば以下:Phpを使用して.docxファイルを処理する

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

ダウンロード用ファイルを提供しようとすると、私はMIMEタイプなどに基づいて拡張子を検出し、サービス提供中の逆を行います

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

} 

すべてのファイルが正しくオープン罰金をダウンロードするように見えるが、(複数のファイル上)のdocxファイル、Wordを開こうとすると、ファイルが破損しているというエラーがスローされます。

素晴らしいアイデアだと思います。

編集#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; 

はFIXED

ReadFile関数を呼び出す前に()私はob_clean追加()およびフラッシュ()問題を修正しているように見えます。

+2

'case( 'jpg' || 'jpeg'):'は動作しません。あなたは 'case 'jpg':case 'jpeg':'と書く必要があります。 – deceze

+0

同様の質問、助けてください:http://stackoverflow.com/questions/179315/downloading-docx-from-ie-setting-mime-types-in-iis – kapa

+0

あなたはクライアント側で受け取った結果は何ですか?ディスクに保存すると有効なファイルですか? – deceze

答えて

5

固定; readfile()を呼び出す前に、問題を修正したように見えるob_clean()とflush()を追加しました。

0

私は数日前に同様の問題がありました。ファイルが読み込まれる直前にいくつかの文字が出力されたためでした。これらの文字は、ダウンロードしたファイルの先頭に挿入され、開こうとしたときに破損しているように見えます(この場合はPDF)。

+0

いいですが、ファイルの前に出力されている文字は表示されません。上記のファイルをどのように出力するかを変更しました。 –