Загрузка файла с удаленного сервера с помощью php-скрипта без fopen
Сценарий: У меня есть веб-страница c# .net. Я хочу, чтобы пользователь мог загрузить файл, размещенный на удаленном сервере, по ссылке на моей странице. Однако при загрузке на моем сервере должна быть минимальная нагрузка. Поэтому я попытался создать экземпляр HttpWebRequest, передал download.php путь
Например. HttpWebRequest мой HttpWebRequest= (HttpWebRequest) Веб-запрос.Создать("http://servername/download.php");
myhttpwebrequest. Мой вопрос.Заголовки. Добавить ("Расположение содержимого", "вложение; имя файла=XXX.pdf"); myHttpWebRequest. Мой вопрос.ContentType = "приложение/pdf";
Передал объект httprequest в сеансе; однако при чтении httpwebresponse на другой странице тип содержимого сбрасывается на "текст/html".
Также php-файл считывает заголовки и использует команду readfile для загрузки файла. Оно выдает следующую ошибку. Предупреждение: readfile() [функция.readfile]: доступ к файлу URL-адреса отключен в конфигурации сервера в
2 answers
Я не совсем понимаю сценарий, но на стороне PHP, если доступ к URL-адресу fopen()
отключен, вашим следующим портом вызова должно быть семейство функций curl. (Или, конечно, активируйте доступ по URL-адресу с помощью опции allow_url_fopen
php.ini, но, похоже, вы не можете этого сделать.)
Заголовок text/html
, вероятно, вызван сбоем загрузки.
Очень примитивный пример:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch); // $result will contain the contents of the request
curl_close($ch);
?>
Вы можете обойти ограничения allow_url_fopen
с помощью fsockopen. Вот (рудиментарная) реализация:
function fsock_get_contents($url) {
$fp = fsockopen($url, 80, $errno, $errstr, 20);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
return false;
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: " . parse_url($url, PHP_URL_HOST) . "\r\n";
$out .= "Connection: Close\r\n\r\n";
$contents = '';
fwrite($fp, $out);
while (!feof($fp)) {
$contents .= fgets($fp, 128);
} fclose($fp);
return $contents;
}
}
echo fsock_get_contents('www.google.com');