2011-06-29 10 views
7

Ok, więc mam ten kod, który pozwoli użytkownikowi na pobranie utworuSpaces w nazwie przerywa pobieranie?

$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'); 

Problem polega na tym, że jeśli utwór ma miejsca w nim jak sinsita happy 1 SONIFI.mp3 użytkownik pobierze tylko plik tekstowy o nazwie sinsita .. .any pomysły, jak rozwiązać ten problem

+0

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

Odpowiedz

11

Musisz podać nazwę pliku w treści dyspozycji:

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

Edit: teraz oznacza to również, że jeśli nazwa pliku zawiera cytat; wtedy musisz uciec z tego cytatu. Tak naprawdę Twój kod wygląda teraz:

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

to działało świetnie, ale w chromie nawet nie pobiera ... ale w safari i firefox działa idealnie ... wszelkie pomysły – Trace

+0

@Tamer: Nie sądzę, że jest to związane z tym problemem. Co się stanie, jeśli usuniesz "plik" razem? (Testowanie dymu, aby sprawdzić, czy to jest problem) – vcsjones

+0

Mała uwaga: użyłem podwójnego cudzysłowu w nagłówku z pojedynczymi cudzysłowami owijającymi nazwę pliku, które nie działały. Wykorzystanie wyceny powinno być jak wyżej. – Martijn