2011-06-29 30 views
7

Ok vì vậy tôi có mã này sẽ cho phép người dùng tải về một bài hátDấu cách trong tên đang vi phạm bản tải xuống?

$file = DIR_DOWNLOAD . $download_info->row['filename']; 
$mask = basename($download_info->row['mask']); 
$mime = 'application/octet-stream'; 
$encoding = 'binary'; 

if (!headers_sent()) { 
if (file_exists($file)) { 
    header('Pragma: public'); 
    header('Expires: 0'); 
    header('Content-Description: File Transfer'); 
    header('Content-Type: ' . $mime); 
    header('Content-Transfer-Encoding: ' . $encoding); 
    header('Content-Disposition: attachment; filename=' . ($mask ? $mask : basename($file))); 
    header('Content-Length: ' . filesize($file)); 
    $file = readfile($file, 'rb'); 

Vấn đề là nếu bài hát có một không gian trong nó như sinsita happy 1 SONIFI.mp3 người dùng sẽ chỉ tải về một tập tin văn bản có tên sinsita .. ý tưởng Bất cứ làm thế nào để sửa chữa hành vi này

+0

Xem http://stackoverflow.com/questions/93551/how-to-encode-the-filename-parameter-of-content-disposition-header-in- http –

Trả lời

11

Bạn cần phải trích dẫn tên tập tin trong việc xử lý nội dung:

header('Content-Disposition: attachment; filename="' . ($mask ? $mask : basename($file)) . '"'); 

Edit: Bây giờ cũng có nghĩa là nếu tên tập tin chứa một báo giá; thì bạn phải thoát khỏi câu nói đó. Vì vậy, thực sự mã của bạn trông giống như sau:

header('Content-Disposition: attachment; filename="' . str_replace('"', '\\"', ($mask ? $mask : basename($file))) . '"'); 
+0

điều này làm việc tuyệt vời nhưng trong chrome của nó thậm chí không tải xuống ... nhưng trong safari và firefox của nó làm việc hoàn hảo ... bất kỳ ý tưởng – Trace

+0

@Tamer: Tôi không nghĩ rằng đó là liên quan đến vấn đề này. Điều gì sẽ xảy ra nếu bạn loại bỏ 'filename' tất cả cùng nhau? (Thử nghiệm khói để xem đó có phải là vấn đề không) – vcsjones

+0

Lưu ý nhỏ: Tôi đã sử dụng trích dẫn kép trong tiêu đề với các trích dẫn đơn bao quanh tên tệp, không hoạt động. Sử dụng báo giá phải là câu trả lời ở trên. – Martijn

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