Как я могу использовать заголовки php для загрузки внешнего файла без использования пропускной способности на моем сервере?

#php #file #http-headers #mime-types #bandwidth

#php #файл #http-заголовки #mime-типы #пропускная способность

Вопрос:

Я использую SO долгое время, но, наконец, у меня возник вопрос, на который я не мог найти ответа. Я хочу использовать свой сайт для перенаправления пользователя на файл, размещенный на другом сервере. Сначала я подумал, что «это должно быть легко»:

 header("Location: $url")
  

Однако файл, размещенный на другом сервере, имеет только uuid в качестве имени файла, поэтому я хочу использовать заголовки для передачи соответствующего mimetype и имени файла (которые я буду знать). Это я могу сделать с помощью следующего кода:

 <?php
$filename = $_REQUEST["name"];
$filesize = $_REQUEST["size"];
$mimetype = $_REQUEST["mime"];
$url = $_REQUEST["url"];

// used to test
$filename = "example.txt";
$filesize = "2966";
$mimetype = "text/plain";
$url = "http://example.com";

header('Content-Type: ' . $mimetype); 
header("Content-length: " . ($filesize   0)); 
header('Content-Disposition: attachment; filename="' . $filename . '"'); 

// this just redirects to the page, ignoring the Content- headers
//header('Location: ' . $url);

// this works, but I suspect that it uses my server's bandwidth
readfile($url);
exit();

?>
  

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

Комментарии:

1. если вы устанавливаете заголовки со своего сервера, то содержимое должно поступать таким же образом, поэтому ему придется использовать вашу пропускную способность

2. Это именно то, что вы подозреваете. readfile() Вызов потребляет пропускную способность на вашем конце, и навязывание считывателей HTTP на внешние ресурсы с перенаправлением невозможно. Если вы не найдете внешнюю службу, которая это делает (и обеспечивает пропускную способность), здесь нет обходных путей.

3. вздох , я так и думал. Спасибо, ребята.

4. Удалить это все, о чем я могу думать

5. Вы можете ответить на это сами 😉

Ответ №1:

 $file=fopen('http://example.com/example.txt','r');
header("Content-Type:text/plain");
header("Content-Disposition: attachment; filename="example.txt");
fpassthru($file);
  

У меня работает для загрузки файлов MP4.

Комментарии:

1. Это правильный ответ. Почти нет использования трафика на главном сервере при передаче потоковой загрузки пользователю

Ответ №2:

Короткий ответ: это просто невозможно; браузер будет просматривать только заголовки с сервера, доставляющего файл.

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

Комментарии:

1. Спасибо. К счастью, у меня есть соединение с владельцем сайта, поэтому я могу действительно что-то сделать здесь.