Вот мой случай: у меня есть файл на сервере (например, www.server1.com/file.rar). Я хочу отправить этот файл моему клиенту. Но, www.server1.com принимает соединения только от одного IP-адреса. У меня много клиентов, поэтому у меня много IP-адресов.
Решением может быть передача файла с сайта www.server1.com на www.server2.com (который имеет только один IP-адрес) и предоставить файл: www.server2.com/file.rar Но … В этом случае мне нужно передайте файл с сервера1 на server2, и это (пропускная способность и пространство).
Есть альтернативы для этого? Я думал о чем-то вроде:
header("Content-Disposition: attachment; filename=" . urlencode($file)); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header("Content-Description: File Transfer"); file_get_contents("http://server1.com/file.rar");
Но не работал должным образом.
заранее спасибо
Редактировать: я не могу ответить на свой вопрос, потому что я новый пользователь … Ну, я хочу сказать спасибо всем за ответы, они отправляют меня на решение. Что такое: file_get_contents не работает из-за сброса сервера, поэтому я использовал fopen и fread с ob_flush и flush
header("Content-Disposition: attachment; filename=" . urlencode($arr[1])); //$arr[1] header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download");header("Content-Description: File Transfer"); ob_flush(); flush(); $fp = fopen($url, "r");//$url variable with file url while (!feof($fp)) { echo fread($fp, 65536); ob_flush(); flush(); } fclose($fp);
Благодаря!
Вы можете использовать readfile (см. http://php.net/manual/en/function.readfile.php). Обратите внимание, что readfile будет работать, только если ваш сервер настроен правильно (как описано в PHP readfile () внешнего URL ).
В качестве альтернативы вы можете использовать echo file_get_contents("http://server1.com/file.rar");
,
здесь какой-то пример кода. Я не испытал это, но думаю, что это сработает. использование cURL и mod rewrite скрывает истинное местоположение файла.
<?php function downloader($url){ $file_name = basename($url); $generated_file = geturl($url, $url); file_put_contents($file_name,$generated_file); $size=strlen($generated_file); if($size==0){die("<b>Error:</b>Location to download not found!");} header('Content-type: application/force-download'); header('Content-Disposition: attachment; filename=' . $file_name); header('Content-Transfer-Encoding: binary'); header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . $size); readfile($file_name); unlink($file_name); } function geturl($url, $referer) { $headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg'; $headers[] = 'Connection: Keep-Alive'; $headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8'; $user_agent = 'ONLY_MY_HOST'; $process = curl_init($url); curl_setopt($process, CURLOPT_HTTPHEADER, $headers); curl_setopt($process, CURLOPT_HEADER, 0); curl_setopt($process, CURLOPT_USERAGENT, $useragent); curl_setopt($process, CURLOPT_REFERER, $referer); curl_setopt($process, CURLOPT_TIMEOUT, 30); curl_setopt($process, CURLOPT_RETURNTRANSFER, 1); curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1); $return = curl_exec($process); curl_close($process); return $return; } downloader('www.server2.com/file.rar','http://www.server1.com'); ?> -CONTENT SERVER PART <?php /* .htaccess RewriteEngine On RewriteCond %{SCRIPT_FILENAME} !-d RewriteRule ^([^\.]+)$ serve.php?file=$1 [NC,L] */ //serve.php if($_SERVER['HTTP_REFERER']=='http://www.server1.com' && $_SERVER['HTTP_USER_AGENT'] =='ONLY_MY_HOST' && $_SERVER['REMOTE_ADDRESS']=='123.123.123.123'){ readfile('./file_store/'.$_REQUEST['file']); die(); } header('Location: http://www.server1.com'); ?>
Используйте readfile
вместо file_get_contents
. Readfile отправит файл клиенту с той же скоростью, что и его загрузка с сервера1. таким образом вам не нужно хранить файл в памяти (как и в файле file_get_contents), и ваш клиент может начать загрузку до того, как вы извлечете весь файл.
Обратите внимание, что это загрузит файл на ваш сервер, но не сохранит его на диске, а отправит его вашему клиенту. Таким образом, использование полосы пропускания будет, но не использование диска. Невозможно решить эту проблему, не загружая файл с сервера1 на server2.
Если вы кешируете файл на диске server2, вы сэкономите использование полосы пропускания за счет диска.
Вы можете либо сохранить пропускную способность до сервера2, скопировав файл на диск server2, либо можете сэкономить место на диске server2, всегда загружая файл с сервера1 всякий раз, когда клиент запрашивает его. Невозможно сделать оба одновременно.