下载用PHP附加强制附件的文件

时间:2009-12-30 18:34:39

标签: php ftp curl download

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

  1. file_get_contents - >返回零大小的文件
  2. 卷曲 - >超时
  3. FTP功能 - >返回零大小的文件
  4. 我认为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部分时,我得到原始文件。不知道为什么他们这样做但我需要按原样使用它。

2 个答案:

答案 0 :(得分:1)

(一个注意:“强制作为附件”的概念在FTP服务器的上下文中没有意义.FTP服务器只提供位;由FTP客户端来决定如何处理它们。与HTTP服务器形成对比,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);

如果将其添加到代码中,您会收到哪些调试信息?

答案 1 :(得分:0)

对于基于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);

?>