使用PHP将文件从Web下载到本地计算机

3

我已经搜索了2天的网络,但找不到答案。

我正在尝试创建一个例程,显示我控制的网站上的文件,并允许用户将所选文件下载到本地驱动器。

我正在使用下面的代码。当取消注释 echo 语句时,它会显示正确的源和目标目录、正确的文件大小,以及 fclose 后的 echo 显示 TRUE。

当我 echo 源文件 ($data) 时,它会显示正确的内容。

$FileName 变量包含正确的文件名,即 .doc/.docx 或 .pdf。我已经测试了两个,没有一个将任何东西保存到目标目录或我的计算机上的其他位置。

源路径 ($path) 在登录后才可访问,但我已经登录。

有什么想法为什么无法写入文件吗?

谢谢, Hank

代码:

$path = "https://.../Reports/ReportDetails/$FileName";
/* echo "Downloading: $path"; */
$data = file_get_contents($path); /* echo "$data"; */
$dest = "C:\MyScans\\".$FileName; /* echo "<br />$dest"; */
$fp = fopen($dest,'wb');
if ( $fp === FALSE ) echo "<br />Error in fopen";
$result = fwrite($fp,$data);
if ( $result === FALSE ) echo "<br />Can not write to $dest";
/* else echo "<br />$result bytes written"; */
$result = fclose($fp); /* echo "<br />Close: $result"; */

1
你的服务器是否在本地机器上? - craig1231
2个回答

2

我认为您有点困惑。

您提到:

允许用户将选择的文件下载到本地驱动器。

但是路径"C:\MyScans\\".$FileNameWeb服务器上的路径,而不是用户自己计算机上的路径。

在从远程网站检索所需文件后:

  1. 从中创建一个文件,并使用header('Location: /path/to/file.txt');将用户重定向到该文件。

  2. 插入以下标题:

    header('Content-disposition: attachment; filename=path/to/file.txt');

它强制用户下载该文件。 这可能是您想要做的事情

注意:我使用了扩展名txt,但您可以使用任何扩展名。


谢谢,这个方法可行。最初我使用了readfile()的头文件,但无法使其工作。然后我尝试了file_get_contents,但似乎也不起作用。然后我尝试了上面的cURL解决方案,但似乎也失败了。我在服务器上寻找文件,但错过了它们。你的答案非常完美,因为它突出了我的问题。然后只需要正确设置文件名路径就可以了。非常感谢。-- Hank - Hank
但是现在我发现网站上的文件(通常是.pdf文件)在我的电脑上损坏了。它们从网站上显示正常,但是在我的家用电脑上却出现“文件已损坏,无法修复”的消息。此外,文件大小从44 KB增加到57 KB。可能是添加了文件头信息吗?(.docx文件也发生了同样的事情。) - Hank
@Hank 我很高兴能帮到你。你最后的问题应该是另一个问题。我认为问题出在编码上。尝试添加 utf8_encode() - Nadav S.
Nadav,事实证明,在下载文件的末尾添加的额外内容是在文件传输后输出到网页的HTML代码(我向用户显示可下载的文件列表;他们单击其中一个文件进行下载,然后返回列表)。我需要在此之前使用ob_start(),之后使用ob_end_flush(),以避免发生这种情况。感谢您的帮助。-- Hank - Hank

1

你可以使用 PHP Curl:

<?php
    $url  = 'http://www.example.com/a-large-file.zip';
    $path = '/path/to/a-large-file.zip';

    $fp = fopen($path, 'w');

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_FILE, $fp);

    $data = curl_exec($ch);

    curl_close($ch);
    fclose($fp);

谢谢,但这个也没解决问题,不过下一个评论解决了问题 - 我把文件保存到了服务器上,而不是本地机器上。(我在那里找过文件,但是错过了它们。) - Hank

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