2013-08-06 2 views
0

Следующий скрипт - это то, что я использую для принудительной загрузки.Проблема с файлами в ForceDownload

// grab the requested file's name 
$file_name = $_GET['file']; 

// make sure it's a file before doing anything! 
if(is_file($file_name)) { 

    /* 
     Do any processing you'd like here: 
     1. Increment a counter 
     2. Do something with the DB 
     3. Check user permissions 
     4. Anything you want! 
    */ 

    // required for IE 
    if(ini_get('zlib.output_compression')) { ini_set('zlib.output_compression', 'Off'); } 

    // get the file mime type using the file extension 
    switch(strtolower(substr(strrchr($file_name, '.'), 1))) { 
     case 'pdf': $mime = 'application/pdf'; break; 
     case 'zip': $mime = 'application/zip'; break; 
     case 'jpeg': 
     case 'jpg': $mime = 'image/jpg'; break; 
     default: $mime = 'application/force-download'; 
    } 
    header('Pragma: public'); // required 
    header('Expires: 0');  // no cache 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Last-Modified: '.gmdate ('D, d M Y H:i:s', filemtime ($file_name)).' GMT'); 
    header('Cache-Control: private',false); 
    header('Content-Type: '.$mime); 
    header('Content-Disposition: attachment; filename="'.basename($file_name).'"'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Content-Length: '.filesize($file_name)); // provide file size 
    header('Connection: close'); 
    readfile($file_name);  // push it out 
    exit(); 

} 

Вопрос выше код работает правильно для файлов меньше, чем 100MB и он может не работает, например, для файлов до 200 МБ и говорят 177 байт загруженных.

Как я могу избавиться от проблемы?

Edit 1:

Основной скрипт копируется из here.

Спасибо!

+3

Там есть строка ваш файл php.ini о максимальном размере загрузки. измените это на все, что захотите. Это должно решить вашу проблему. 'upload_max_filesize = 20M', например –

+1

В дополнение к предыдущему комментарию: убедитесь, что ваш post_max_size также правильно выровнен. –

+0

Я не вижу, как код выше каким-либо образом связан с загрузками? – BenLanc

ответ

2

Я подозреваю, что вы заставляете PHP использовать слишком много памяти, загружая файл в память за один раз - взгляните на содержимое загруженного файла, и вы, вероятно, увидите его обычный текст и содержащий PHP фатальное сообщение об ошибке.

Вы бы хорошо, чтобы загрузить файл в более мелкие куски и передать его обратно на веб-сервер для обслуживания, например, попробуйте поменять вашу линию «ReadFile» со следующим:

// Open the file for reading and in binary mode 
$handle = fopen($file_name,'rb'); 
$buffer = ''; 

// Read 1MB of data at a time, passing it to the output buffer and flushing after each 1MB 
while(!feof($handle)) 
{ 
    $buffer = fread($handle, 1048576); 
    echo $buffer; 
    @ob_flush(); 
    @flush(); 
} 
fclose($handle); 
Смежные вопросы