2012-04-26 24 views
6

Nie mam szczęścia służąc. Dmg z mojego sklepu internetowego. I okrojona kod tylko następujące debugowania, ale bez względu na to, co dostaję plik zero-bajtowy serwowane:Jak obsługiwać plik .dmg przez PHP/readfile?

header('Content-Type: application/x-apple-diskimage'); // also tried octet-stream 
header('Content-Disposition: attachment; filename="My Cool Image.dmg"'); 
$size = filesize('/var/www/mypath/My Cool Image.dmg'); 
header('Content-Length: '.$size); 
readfile('/var/www/mypath/My Cool Image.dmg'); 

Ten sam kod działa dla wielu innych typów plików, które mi służą bin, ZIP , pdf. Jakieś sugestie? Profesor Google nie jest moim przyjacielem.

+0

Czy to działa, jeśli w nazwie pliku nie ma spacji? – Thilo

Odpowiedz

1

Nie powinno mieć miejsca w nazwie pliku (przeznaczone nie powinny być stosowane, jeśli chodzi o sieci hostowanych plików)

Spróbuj coś takiego lub zmień nazwę pliku bez spacji:

<?php 
$path ='/var/www/mypath/'; 
$filename = 'My Cool Image.dmg'; 

$outfile = preg_replace('/[^a-zA-Z0-9.-]/s', '_', $filename); 

header('Content-Type: application/x-apple-diskimage'); // also tried octet-stream 
header('Content-Disposition: attachment; filename="'.$outfile.'"'); 

header('Content-Length: '.sprintf("%u", filesize($file))); 

readfile($path.$filename); //This part is using the real name with spaces so it still may not work 
?> 
+0

Dobra sugestia, ale to nie problem - wszystkie pliki, które obsługuję, mają spacje w nazwie pliku i zawsze działają. –

4

Found rozwiązanie. Winowajcą była readfile() i mogła być związana z pamięcią. W miejsce readfile (linii), używam to:

$fd = fopen ('/var/www/mypath/My Cool Image.dmg', "r"); 
while(!feof($fd)) { 
    set_time_limit(30); 
    echo fread($fd, 4096); 
    flush(); 
} 
fclose ($fd); 

Teraz obsługujących wszystkie typy plików prawidłowo, DMG włączone.

+0

Problem polegał na tym, że plik jest za duży? – Thilo