Загрузка файла с удаленного сервера с помощью 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-адреса отключен в конфигурации сервера в

Author: hakre, 2010-07-23

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);
 ?>
 2
Author: Pekka 웃, 2010-07-23 10:09:55

Вы можете обойти ограничения 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');
 0
Author: NullUserException, 2010-07-23 10:34:01