2013-03-04 4 views
0

Я написал сценарий загрузки с javascript и php. Он работает, но если я хочу загрузить большой файл (пример 1GB zip-файла), он должен долго работать с запросом. Я думаю, что это что-то делать, что я читаю файл. Если это так, любая идея, как получить его быстрее?
Извещение: Мне нужен заголовок, причина принудительной загрузки, как изображения, pdf-файлы, любые типы файлов.Скачиваний очень медленно

JS очень прост. Посмотрите на это:

function downloadFile(file){ 
    document.location.href = "script.php?a=downloadFile&b=."+ file; 
} 

PHP является простой, но:

function downloadFile($sFile){ 
    #Main function 
    header('Content-Type: '.mime_content_type($sFile)); 
    header('Content-Description: File Transfer'); 
    header('Content-Length: ' . filesize($sFile)); 
    header('Content-Disposition: attachment; filename="' . basename($sFile) . '"'); 
    readfile($sFile); 
} 

switch($_GET['a']){ 

    case 'downloadFile': 
     echo downloadFile($_GET['b']); 
     break; 
} 
+1

можно удалить эхо от коммутатора к DownloadFile, и вместо того, чтобы читать весь файл в один присест, кусок его по чтение и повторение небольшого количества файлов за раз. – NickSlash

ответ

3

Я думаю, буферизация является проблемой для больших файлов. Попробуйте прочитать файл в небольших кусках (например, мегабайт) и вызвать функцию flush, чтобы очистить выходной буфер после печати каждого фрагмента.

EDIT: да, хорошо, вот пример кода, вы должны попробовать:

function downloadFile($sFile){ 
    #Main function 

    if ($handle = fopen($sFile, "rb")) { 
     header('Content-Type: '.mime_content_type($sFile)); 
     header('Content-Description: File Transfer'); 
     header('Content-Length: ' . filesize($sFile)); 
     header('Content-Disposition: attachment; filename="' . basename($sFile) . '"'); 

     while (!feof($handle)) { 
      print fread($handle, 1048576); 
      flush(); 
     } 
     fclose($handle); 
    } else { 
     header('Status: 404'); 
     header('Content-Type: text/plain'); 
     print "Can't find the requested file"; 
    } 
} 
+0

Я действительно хочу использовать загрузку из браузера. Если я открою сайт www.example.com/some.zip, браузер автоматически загрузит файл. Нет ли возможности сделать эту загрузку с любым файлом расширения (картинки, pdfs, ...?) Или мне нужно отправить заголовок обратно с файлами chunk? – Sylnois

+0

Да, что? .. Я обновил ответ на примере, который вы должны попробовать. – JackTheRandom

Смежные вопросы