2016-10-13 3 views
0

Как я могу передать файл через php? Также мне нужно передать некоторые заголовки в удаленный файл.Поток файла через php с заголовками

псевдокод:

End user (download zip) <-> http://localhost/script.php?downloadId=1 <-> http://example.com/file.zip 

с заголовками:

Cache-Control: No-Cache 

Я попытался придумать мое собственное решение, но это делает сервер Nginx бросить

504 Gateway Time-out 

Вот что код :

<?php 
    set_time_limit(0); 

    define('CHUNK_SIZE', 1024*1024); 

    $url = "http://example.com/file.zip"; 

    $opts = array(
     'http'=>array(
      'method'=>"GET", 
      'header'=>"Accept-language: en\r\n" . 
       "Cache-Control: No-Cache\r\n" . 
       "Connection: Keep-Alive\r\n" 
     ) 
    ); 
    $context = stream_context_create($opts); 
    stream_context_set_default($opts); 

    $fp = fopen($url, 'r', false, $context); 
    foreach (get_headers($url) as $header) 
    { 
     header($header); 
    } 

    //fpassthru($fp); 

    while (!feof($fp)) { 
     $buffer = fread($fp, CHUNK_SIZE); 
     echo $buffer; 
     ob_flush(); 
     flush(); 

     if ($retbytes) { 
      $cnt += strlen($buffer); 
     } 
    } 

    $status = fclose($fp); 

    if ($retbytes && $status) { 
     return $cnt; // return num. bytes delivered like readfile() does. 
    } 

    exit; 
?> 
+0

Пожалуйста, см [спросить] и [mcve]. – Mat

ответ

0

Используйте readfile() для отправки файла и header('Cache-Control: No-Cache') для заголовка.

Пример из официальной документации PHP:

$file = 'monkey.gif'; 

if (file_exists($file)) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="'.basename($file).'"'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    readfile($file); 
    exit; 
} 

http://php.net/manual/de/function.readfile.php

Для более альтернатив, взглянуть на Streaming a large file using PHP

+0

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

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