2012-06-24 36 views
6

Tôi đang sử dụng truy vấn cơ sở dữ liệu trong PHP để truy lục tệp nhị phân. Nhưng khi tôi đang cố gắng để tải về nó, tiêu đề ('Content-type: application/octet-stream') dòng gây ra 0 byte tập tin. Nếu không có dòng đó, tôi có thể tải xuống tệp có nội dung đầy đủ. Đó là một tập tin nhị phân đó là chắc chắn vì vậy tôi chỉ không thể hiểu tại sao dòng đó gây ra vấn đề. Mã:tiêu đề ('Loại nội dung: ứng dụng/octet-stream') gây ra 0 tệp byte

$result = mysql_query("SELECT data FROM stored_file WHERE file_name = '$q'"); 

while($row = mysql_fetch_array($result)) 
{ 
    $file = $row['data']; 
} 


    header('Content-disposition: attachment; filename='.$q); 
    header('Content-type: application/octet-stream'); 
    header('Content-Length: '.filesize($file)); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 
    echo $file; 

Bất kỳ ý tưởng nào? Cảm ơn.

+2

Nhận xét tất cả các tiêu đề; cho phép báo cáo lỗi và chạy tập lệnh của bạn. Đăng bất kỳ thông báo lỗi nào. –

+0

Tôi không nhận được thông báo lỗi. – Akos

+0

Mặc dù có vẻ như các tệp ($ file) không trả về gì cả. – Akos

Trả lời

5

filesize() sẽ không trả lại giá trị có ý nghĩa.

Bạn có dữ liệu nhị phân trong $file, không một thực tế filename theo yêu cầu như tham số đầu tiên. Do đó bạn sẽ nhận được một lỗi. (Kích hoạt error_reporting! Không nhìn thấy lỗi, và không có chúng là hai điều khác nhau.)

Vì vậy, những gì bạn muốn sử dụng ở đó là strlen($file), không filesize().

Btw, application/octet-stream hoặc các trình bổ sung khác không sử dụng để buộc tải xuống. Đó là tiêu đề Content-Disposition: có vai trò quan trọng nhất đối với hiệu ứng đó. Bạn vẫn được phép gửi đúng loại MIME.

+0

Cảm ơn rất nhiều! Việc sử dụng tiêu đề Content-Length có quan trọng không? Giới thiệu về báo cáo lỗi. Tôi cho phép nó php.ini và thậm chí cả trong mã: ini_set ('display_errors', 1); error_reporting (E_ALL); vì vậy tôi không hiểu tại sao tôi không nhận được thông báo lỗi. – Akos

+0

Như phương sách cuối cùng, hãy thử 'set_error_handler (" var_dump ");' trên đỉnh tập lệnh. Tiêu đề Content-Length: được coi là thứ yếu, nó thường sẽ hoạt động mà không có. Dữ liệu meta tải trọng chỉ được yêu cầu nếu bạn cũng triển khai Phạm vi: tiêu đề, v.v. giống như máy chủ web. – mario

1

Từ nhìn vào truy vấn tôi đoán rằng trong $row['data'] là dữ liệu nhị phân được lưu trữ. Để đặt tiêu đề Độ dài nội dung chính xác, bạn nên sử dụng mb_strlen($row['data']);. Nếu không có hỗ trợ nhiều byte (các chức năng mb_) được kích hoạt trên máy của bạn, hãy sử dụng strlen(). Nhưng lưu ý, điều này có thể dẫn đến kết quả akward vì dữ liệu nhị phân thực sự có thể chứa chuỗi byte EOF và trả về độ dài quá ngắn. Với hàm mb_strlen bạn đang ở bên lưu.

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