【问题标题】:Download a file that is forced as attachment with PHP使用 PHP 下载强制作为附件的文件
【发布时间】:2009-12-30 18:34:38
【问题描述】:

我正在尝试使用 PHP 从 FTP 服务器下载文件,我也可以从 http 访问该文件。例如:FTP://username:password@someserver.com/file_name_here.gz。该文件被强制作为来自服务器的附件(而不是 PDF 或 TXT 将执行的操作,例如:输出)。 我尝试了 3 种不同的方法:

  1. file_get_contents -> 返回一个零大小的文件
  2. 卷曲 -> 超时
  3. FTP 函数 -> 返回一个零大小的文件

我认为 CURL 是这样做的方法,但我无法下载文件...这是我的代码:

$curl = curl_init();
$url ='ftp://'.$network['username'].':'.$network['password'].'@'.$network['metadata_url'].'/'.$path.'/'.$data['title'];
curl_setopt($curl, CURLOPT_URL,$url);
//curl_setopt($curl, CURLOPT_USERPWD, "$_FTP[username]:$_FTP[password]");
//curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
$file = fopen("./feeds/".$data['title'], "w");
curl_setopt($curl, CURLOPT_FILE, $file);
$result = curl_exec ($curl);

我尝试在 CURLOPT_URL 中设置用户名和密码,并使用 CURL 设置它们。两种方式都会发生同样的事情......

你能帮忙吗?

Edit: 忘了说文件是从服务器动态提供的。例如,真正的文件是:filename.gz.check,当我省略 .check 部分时,我得到了原始文件。不知道他们为什么这样做,但我需要照原样处理。

【问题讨论】:

标签: php ftp curl download


【解决方案1】:

(请注意:“强制作为附件”的概念在 FTP 服务器的上下文中没有意义。FTP 服务器只提供位;由您的 FTP 客户端决定如何处理它们。这与 HTTP 服务器相反,后者提供这些位,但也提供有关这些位的元数据(例如,HTTP 标头);正是元数据指示您的客户端做什么(显示与强制下载/保存操作)。当您将您的浏览器用作 FTP 客户端,浏览器决定如何处理对 FTP GET 请求的响应,并且该过程与它如何决定如何处理对 HTTP GET 请求的响应完全分开。)

您是否首先尝试了使用硬编码值的代码,以确保问题不在于您在 $network 和 $_FTP 变量中传递了意外或未预料到的值数据?换句话说,测试一下,替换一个已知良好的用户名、密码、主机名和文件名,并确保您有权将文件写入当前工作目录:

$curl = curl_init();
$url = "ftp://hostname/filename.gz";
$file = fopen("filename.gz", "w");
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_FILE, $file);
curl_setopt($curl, CURLOPT_USERPWD, "username:password");
curl_exec($curl);
curl_close($curl);
fclose($file);

无论如何,您还可以添加以下内容以将调试信息发送回您的浏览器:

curl_setopt($curl, CURLOPT_VERBOSE, 1);

如果你把它添加到你的代码中,你会得到什么调试信息?

【讨论】:

  • 我什么也没得到...我知道使用的值没问题(我用 echo 检查了它们以查看传递给 curl 的 url 和参数)
【解决方案2】:

对于基于 cURL 的解决方案,请尝试以下方式:

curl_setopt($curl, CURLOPT_CONNECTTIMEOUT,0);

你也可以试试这个程序,告诉我们会发生什么:

<?php

$conn = ftp_connect("ftp.someserver.com") or die("Could not connect");

ftp_login($conn,"username","password");

echo ftp_size($conn,"source.tgz");

echo ftp_get($conn,"target.tgz","source.tgz",FTP_BINARY);

ftp_close($conn);

?> 

【讨论】:

    猜你喜欢
    • 2010-11-03
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 2011-11-08
    • 2012-11-11
    相关资源
    最近更新 更多