Загрузка файла с удаленного сервера с использованием php-скрипта без fopen - PullRequest
2 голосов
/ 23 июля 2010

Сценарий: у меня есть веб-страница ac # .net.Я хочу, чтобы пользователь мог загрузить файл, размещенный на удаленном сервере, по ссылке на моей странице.Однако при загрузке на моем сервере должна быть минимальная нагрузка.Поэтому я попытался создать экземпляр HttpWebRequest, передал путь download.php

например, HttpWebRequest myHttpWebRequest = (HttpWebRequest) WebRequest.Create ("http://servername/download.php");

myHttpWebquaders..Add ("Content-disposition", "attachment; filename = XXX.pdf"); myHttpWebRequest.ContentType = "application / pdf";

Передал объект httprequest в сеанс, однако при чтенииhttpwebresponse на другой странице, тип содержимого сбрасывается на «text / html».

Кроме того, php-файл считывает заголовки и использует команду readfile для загрузки файла. Выдает следующую ошибку. Предупреждение:readfile () [function.readfile]: доступ к файлам URL отключен в конфигурации сервера в

Ответы [ 2 ]

2 голосов
/ 23 июля 2010

Я не совсем понимаю сценарий, но на стороне PHP, если fopen() доступ по URL отключен, ваш следующий порт вызова должен быть семейством функций 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);
 ?>
0 голосов
/ 23 июля 2010

Вы можете обойти ограничения 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');
...