PHP 服务器向服务器请求文件

3
我在A服务器上有脚本1,用户从中请求文件。
我在B服务器上有脚本2(文件仓库),我检查用户是否可以访问它并返回正确的文件(我使用智能文件下载http://www.zubrag.com/scripts/download.php)。

我尝试了cURL和file_get_contents,我以各种方式更改了Content Header,但我仍无法下载文件。

这是我的请求:

$request = "http://mysite.com/download.php?f=test.pdf";

它运行良好。 在脚本1中我应该调用什么来强制下载文件? 一些尝试: 这个可以工作,但我不知道如何处理未授权或下载失败的情况。
header('Content-type: application/pdf');

$handle = fopen($request, "r");

if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
        echo $buffer;
    }
    fclose($handle);
}

这会直接在浏览器中打印pdf代码(而非文本),我认为这是一个头部问题。
$c = curl_init();
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_URL, $request);
$contents = curl_exec($c);
curl_close($c);

if ($contents) return $contents;
    else return FALSE;

这将生成一个空白页面。
file_get_contents($request);

你的错误信息是什么?在php.ini中是否启用了allow_url_fopen - Michael Berkowski
你的意思是PDF文件在浏览器中显示而不是下载吗? - Dutow
不,我的意思是我看到了PDF标签和无法阅读的字符。 - pasine
5个回答

2
为了强制下载,请添加以下内容:
 header('Content-disposition: attachment');

但需要注意的是,这已经不再是HTTP 1.1规范中的内容了。请先查看HTTP响应头中Content-Disposition用途的第一个答案。


1

没有您的代码,我不知道您尝试了什么,但是您需要通过cURL获取文件内容,然后将其保存到服务器。类似于...

$url = 'http://website.com/file.pdf';
$path = '/tmp/file.pdf';

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$contents = curl_exec($ch);
curl_close($ch);

file_put_contents($path, $contents);

1

如果您想从FTP服务器下载文件,可以使用php文件传输协议(FTP)扩展。请查看下面的代码:

<?php
$SERVER_ADDRESS="";
$SERVER_USERNAME="";
$SERVER_PASSWORD="";
$conn_id = ftp_connect($SERVER_ADDRESS);

// login with username and password
$login_result = ftp_login($conn_id, $SERVER_USERNAME, $SERVER_PASSWORD);

$server_file="test.pdf" //FTP server file path 
$local_file = "new.pdf"; //Local server file path 

##----- DOWNLOAD $SERVER_FILE AND SAVE IT TO $LOCAL_FILE--------##
if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) {
    echo "Successfully written to $local_file\n";
} else {
    echo "There was a problem\n";
}

ftp_close($conn_id);
?>

1

已解决

最终我只是通过重定向请求来解决了问题:

header("Location: $request");

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接