2012-04-26 18 views
6

Tôi không có may mắn khi phục vụ .dmg từ cửa hàng trực tuyến của mình. Tôi tước xuống mã để chỉ sau để gỡ lỗi, nhưng không có vấn đề gì tôi nhận được một tập tin zero-byte phục vụ:Làm cách nào để phân phối tệp .dmg thông qua 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'); 

Mã này cùng làm việc cho một số loại khác tập tin mà tôi phục vụ: bin, zip , pdf. Bất kỳ đề xuất? Giáo sư Google không phải là bạn của tôi.

+0

Tính năng này có hoạt động nếu không có không gian trong tên tệp không? – Thilo

Trả lời

1

Bạn không nên có khoảng trống trong tên tập tin (Spaces không nên được sử dụng khi nói đến web file lưu trữ)

Hãy thử một cái gì đó như thế này hoặc đổi tên tập tin của bạn không có dấu cách:

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

Đề xuất tốt, nhưng đây không phải là vấn đề - tất cả các tệp tôi phục vụ đều có khoảng trống trong tên tệp và nó luôn hoạt động. –

4

Tìm thấy giải pháp. Thủ phạm là readfile() và có thể liên quan đến bộ nhớ. Thay cho dòng readfile(), tôi đang sử dụng điều này:

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

Hiện tại, tất cả các loại tệp được bao gồm đúng cách, bao gồm DMG.

+0

Vì vậy, vấn đề là tệp quá lớn? – Thilo

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