【问题标题】:Downloading File from remote server using php script without fopen使用没有 fopen 的 php 脚本从远程服务器下载文件
【发布时间】:2011-03-20 00:39:37
【问题描述】:

场景:我有一个 c# .net 网页。我希望用户能够从我页面上的链接下载放置在远程服务器上的文件。但是,在下载时,我的服务器上应该有最小的负载。因此我尝试创建一个 HttpWebRequest 实例,传递了 download.php 路径

例如 HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create("http://servername/download.php");

myHttpWebRequest.Headers.Add (“内容处置”,“附件;文件名=XXX.pdf”); myHttpWebRequest.ContentType = "应用程序/pdf";

在会话中传递了httprequest对象;然而,在另一个页面上阅读 httpwebresponse 时,内容类型被重置为“text/html”。

php 文件也读取标题并使用 readfile 命令下载文件。它给出了以下错误。 警告:readfile() [function.readfile]:在服务器配置中禁用 URL 文件访问

【问题讨论】:

  • 感谢您提供的信息。我尝试过更改脚本。我在我的 c# 代码中添加了以下内容,我在 php 文件中读取了这些标头并相应地设置了标头。 IE 响应并加载文件,但 Chrome 和 Firefox 显示二进制数据。谢谢你的信息。我尝试过更改脚本。我在我的 c# 代码中添加了以下内容 myHttpWebRequest.Headers.Add("DESC", "File Transfer"); myHttpWebRequest.Headers.Add("DISP", "附件;文件名=cards.jpg"); myHttpWebRequest.Headers.Add("CONT", "image/jpeg"); myHttpWebRequest.Headers.Add("ENCODE", "binary");

标签: php .net-3.5 c#-3.0 download


【解决方案1】:

您可以使用 fsockopen 绕过 allow_url_fopen 限制。这是一个(基本的)实现:

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');

【讨论】:

    【解决方案2】:

    我并不完全理解这种情况,但在 PHP 方面,如果禁用了 fopen() URL 访问,那么您的下一个调用端口应该是 curl 系列函数。 (或者,当然,使用allow_url_fopen php.ini 选项激活 URL 访问,但听起来你不能这样做。)

    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);
     ?>
    

    【讨论】:

    • 请注意,您也将无法使用file_get_contents
    • 感谢您提供的信息。我尝试过更改脚本。我在我的 c# 代码中添加了以下内容,我在 php 文件中读取了这些标头并相应地设置了标头。 IE 响应并加载文件,但 Chrome 和 Firefox 显示二进制数据。谢谢你的信息。我尝试过更改脚本。我在我的 c# 代码中添加了以下内容 myHttpWebRequest.Headers.Add("DESC", "File Transfer"); myHttpWebRequest.Headers.Add("DISP", "附件;文件名=cards.jpg"); myHttpWebRequest.Headers.Add("CONT", "image/jpeg"); myHttpWebRequest.Headers.Add("ENCODE", "binary");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多