2011-01-05 33 views
5

Tôi đang gặp sự cố khi cố gắng phân phát tệp .docx bằng Php. Khi tải lên tệp, tôi phát hiện loại tệp mime và tải lên tệp bằng tệp có phần mở rộng chính xác dựa trên loại mime; ví dụ. bên dưới:Cung cấp các tệp .docx qua Php

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

Khi cố gắng phân phối tệp để tải xuống, tôi làm ngược lại trong việc phát hiện tiện ích mở rộng và phân phối dựa trên loại mime ví dụ:

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

} 

Tất cả các file xuất hiện để tải một cách chính xác và mở tốt nhưng khi cố gắng mở một file docx, Word (trên nhiều file) ném một lỗi nêu các tập tin bị hỏng.

Bất kỳ ý tưởng nào cũng tuyệt vời, cảm ơn.

Chỉnh sửa # 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

Trước khi gọi readfile() tôi đã thêm ob_clean() và flush() mà dường như đã cố định vấn đề.

+2

'trường hợp ('jpg' || 'jpeg'):' không hoạt động, bạn cần viết 'case' jpg ': case' jpeg ': '. – deceze

+0

Câu hỏi tương tự, có thể trợ giúp: http://stackoverflow.com/questions/179315/downloading-docx-from-ie-setting-mime-types-in-iis – kapa

+0

Kết quả bạn nhận được ở phía khách hàng là gì? Đây có phải là tệp hợp lệ khi được lưu vào đĩa không? – deceze

Trả lời

5

Đã sửa lỗi; trước khi gọi readfile() tôi đã thêm ob_clean() và flush() dường như đã khắc phục được sự cố.

0

Tôi đã gặp sự cố tương tự vài ngày trước. Đó là do một số ký tự được xuất ngay trước khi tệp được đọc. Các ký tự này được chèn vào đầu tệp đã tải xuống, làm cho nó bị hỏng khi tôi cố mở nó (PDF trong trường hợp này).

+0

Chúc mừng nhưng dường như không có bất kỳ ký tự nào được xuất trước tệp. Tôi đã sửa đổi ở trên để hiển thị như thế nào tập tin là đầu ra. –

Các vấn đề liên quan