2012-04-26 13 views
6

Non riesco a servire un .dmg dal mio negozio online. Ho messo a nudo giù il codice per appena il seguente per eseguire il debug, ma non importa ciò che ottengo un file di zero byte servito:Come servire un file .dmg tramite 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'); 

Questo stesso codice funziona per un certo numero di altri tipi di file che servo: bin, zip , PDF. Eventuali suggerimenti? Il professore Google non è mio amico.

+0

Funziona se non c'è spazio nel nome del file? – Thilo

risposta

1

Non si dovrebbe avere spazi nel nome del file (spazi non devono essere utilizzati quando si parla di web file ospitati)

provare qualcosa di simile o rinominare il file senza spazi:

<?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

Buon suggerimento, ma questo non è il problema - tutti i file che servo hanno spazi nel nome del file, ed è sempre funzionante. –

4

Trovato la soluzione. Il colpevole era readfile() e potrebbe essere stato collegato alla memoria. Al posto della linea ReadFile(), sto usando questo:

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

E 'ora che serve tutti i tipi di file correttamente, DMG inclusa.

+0

Quindi il problema era che il file era troppo grande? – Thilo

Problemi correlati