【问题标题】:PHP and download pdf file from local serverPHP并从本地服务器下载pdf文件
【发布时间】:2017-08-21 12:39:25
【问题描述】:

我在从本地服务器下载 pdf 时遇到问题。我有一个文档文件的 url(例如:\10.10.10.10\directory\123_ABC.pdf)。我必须制作从 url 下载文件并在网络浏览器中显示的 php 函数。对此目录的访问受到保护(用户名和密码)。我不知道如何下载这个文件。也许卷曲?这可能吗?

我试过了:

$login = 'LOGIN';
$password = 'PASSOWRD';
$host = "http://10.10.10.10/directory/123_ABC.pdf";
$CurlConnect = curl_init();
curl_setopt($CurlConnect, CURLOPT_URL, $host);
curl_setopt($CurlConnect, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($CurlConnect, CURLOPT_USERPWD, $login.':'.$password);
$Result = curl_exec($CurlConnect);

header('Cache-Control: public');
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="new.pdf"');
header('Content-Length: '.strlen($Result));
v($Result) ;

文件new.pdf在浏览器中显示,但是坏掉了。

编辑: 我解决了问题。我无法下载 pdf 文件,因为我使用了错误的协议。 这段代码是正确的:

$login = 'LOGIN';
$password = 'PASSOWRD';
$host = "ftp://10.10.10.10/directory/123_ABC.pdf";
$CurlConnect = curl_init();
curl_setopt($CurlConnect, CURLOPT_URL, $host);
curl_setopt($CurlConnect, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($CurlConnect, CURLOPT_USERPWD, $login.':'.$password);
$Result = curl_exec($CurlConnect);
curl_close ($ch);
header('Cache-Control: public');
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="new.pdf"');
header('Content-Length: '.strlen($Result));
echo $Result;

【问题讨论】:

  • 用什么方法来密码保护这个文件? HTTP 身份验证?
  • 将标题数据设置为 application/pdf 并使用 echo file_get_contents();和死();

标签: php pdf curl server local


【解决方案1】:

您可以使用file_put_contents 将文件从 url 下载到您的服务器。

file_put_contents("example.pdf", fopen("http://10.10.10.10\directory\123_ABC.pdf","rb"));

【讨论】:

  • fopen 只是浪费,前提是allow_url_fopen 开启,file_put_contents 获取http url 和fopen 一样,但是如果它被禁用,它们都不会工作。以及如何使用用户名和密码下载它取决于所使用的身份验证方法,但在所有情况下,这是错误的方法,您不要在此 sn-p 的任何地方提供用户名/密码
  • @hanshenrik fopen 打开带有属性的 url,file_put_contents 将流式传输打开的文件。是的,条件都应该保持开放。
【解决方案2】:

引用:The file new.pdf is displayed in the browser, but it is broken - 不正确,pdf文件没有显示在浏览器中,而是因为你发送了标题header('Content-Disposition: attachment; filename="new.pdf"');,告诉浏览器你正在发送一个pdf文件,浏览器尝试将您注销的错误页面呈现为 pdf,并且由于 HTML(您的注销错误页面可能包含)和 PDF 是两种完全不同的格式,因此 pdf 解析器无法呈现它(最大的区别是 HTML 是基于文本的,而PDF是二进制格式)

如何登录取决于服务器使用的登录系统。 curl 内置了对几种类型的支持,即HTTP Basic authenticationHTTP Digest authenticationHTTP NTLM authentication,其中大部分是标准化的,但没有一种被广泛使用。很可能,它们使用您必须自己实现的自定义登录方案。最常见的方案包括将用户名和密码发送到登录页面,然后登录页面在 cookie 中提供session id,您必须使用该 cookie 访问所有需要您登录的页面。(例如, stackoverflow.com 、 wikipedia.com 和 facebook.com 都有自己的 cookie-session-id 方案版本) - 您必须先找出服务器使用的登录方案,然后这里的任何人才能告诉您如何登录in. 如果你幸运的话,他们使用 1 个内置的(罕见的)方案来 curl,在这种情况下,你必须使用 CURLOPT_HTTPAUTH 和 CURLOPT_USERPWD 登录。用于登录的方法是最好的通过研究登录页面推断。在浏览器中访问登录页面时,您会得到哪些 http 标头和正文?在谷歌浏览器中,您可以通过按 Ctrl+Shift+I 来查看此内容,然后在浏览到登录页面之前转到“网络”选项卡,然后浏览到该页面,然后您应该在“网络”选项卡中看到请求,在那里您可以看到接收和发送的headers和response body(通常是html)

【讨论】:

    猜你喜欢
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    相关资源
    最近更新 更多