2012-04-26 2 views
6

Мне не повезло в том, что я был в моем интернет-магазине .dmg. Я разделась код только следующего отлаживать, но независимо от того, что я получаю файл нулевых байт служило:Как подать файл .dmg через 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'); 

Этот же код работает для ряда других типов файлов, которые я служу: бин, молнии , pdf. Какие-либо предложения? Профессор Google не мой друг.

+0

Он работает, если в имени файла нет места? – Thilo

ответ

1

Вы не должны иметь пробелы в имени файла (пробелы не следует использовать, когда речь идет о веб-размещенных файлов)

Попробуйте что-то вроде этого или переименовать файл без пробелов:

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

Хорошее предложение, но это не проблема - все файлы, которые я обслуживаю, имеют пробелы в имени файла, и это всегда работает. –

4

Found решение. Преступник был readfile() и, возможно, был связан с памятью. Вместо линии ReadFile(), я использую это:

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

Это теперь обслуживает все типы файлов должным образом, DMG включены.

+0

Значит, проблема в том, что файл слишком велик? – Thilo