Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中使用curl从FTP下载文件_Php_Curl_Ftp - Fatal编程技术网

在php中使用curl从FTP下载文件

在php中使用curl从FTP下载文件,php,curl,ftp,Php,Curl,Ftp,我正在制作一个php脚本,打算在CLI中运行,它将帮助我在ftp服务器上下载文件。 我会告诉你到底是哪里出了问题,但在我向你解释上下文之前 我注册在一个共享旧游戏图像文件的网站上。当我们想在这个网站上下载一个文件时,我们必须用日志来检索下载链接。然后,给出的链接是FTP下载链接 我使用Wireshark捕获了FTP连接数据包,并将其与失败的脚本FTP Transfer进行了比较 所以,。。 FTP服务器接受匿名连接。 当我使用浏览器下载文件时,文件的链接是这样的 现在,如果我使用FileZil

我正在制作一个php脚本,打算在CLI中运行,它将帮助我在ftp服务器上下载文件。 我会告诉你到底是哪里出了问题,但在我向你解释上下文之前

我注册在一个共享旧游戏图像文件的网站上。当我们想在这个网站上下载一个文件时,我们必须用日志来检索下载链接。然后,给出的链接是FTP下载链接

我使用Wireshark捕获了FTP连接数据包,并将其与失败的脚本FTP Transfer进行了比较

所以,。。 FTP服务器接受匿名连接。 当我使用浏览器下载文件时,文件的链接是这样的

现在,如果我使用FileZilla连接到这个FTP,通过匿名登录我会获得访问权限,我会看到一些文件夹,但是当我转到iso必须位于的“somefolder”时,文件夹是空的

看这张图,然后我会给你看代码。 现在是代码

function download_file($url){
    echo "Downloading: ".$url;
    $ch = curl_init($url);
    $fp = fopen("data/output.rar", "w");
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, 'data/cookies.txt');
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    //curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    //curl_setopt($ch, CURLOPT_FTPLISTONLY, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERPWD, "anonymous:mozilla@example.com");
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_exec($ch);
    //var_dump(curl_getinfo($ch));
    //echo curl_error($ch);
    curl_close($ch);
    fclose($fp);
}
有人能帮我吗?我不熟悉curl,也不知道如何让curl准确地发送我想要的命令

谢谢大家!


编辑:看看这个,问题完全一样

您需要将完整URL提供给文件。如果你想下载一个文件,你可能想把它保存在某个地方

工作示例:

$curl = curl_init();
$file = fopen("ls-lR.gz", 'w');
curl_setopt($curl, CURLOPT_URL, "ftp://ftp.sunet.se/ls-lR.gz"); #input
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FILE, $file); #output
curl_setopt($curl, CURLOPT_USERPWD, "$_FTP[username]:$_FTP[password]");
curl_exec($curl);
curl_close($curl);
fclose($file);
好了,伙计们,我明白了:)

我使用ftp的ftp_*函数来代替curl,因为curl试图更改目录,但在这个ftp服务器上是不允许的,所以我使用的代码是

$local_file = 'output.rar';
$server_file = '/somedir/1/bar/foo/somearchive.rar';
$ftp_user_name='anonymous';
$ftp_user_pass='mozilla@example.com';
$ftp_server='server.host';
// set up basic connection
$conn_id = ftp_connect($ftp_server);

// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

/* uncomment if you need to change directories
if (ftp_chdir($conn_id, "<directory>")) {
    echo "Current directory is now: " . ftp_pwd($conn_id) . "\n";
} else { 
    echo "Couldn't change directory\n";
}
*/

// try to download $server_file and save 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";
}

// close the connection
ftp_close($conn_id);
$local_file='output.rar';
$server_file='/somedir/1/bar/foo/somearchive.rar';
$ftp_user_name='anonymous';
$ftp\u user\u pass='1mozilla@example.com';
$ftp_server='server.host';
//建立基本连接
$conn\u id=ftp\u connect($ftp\u server);
//使用用户名和密码登录
$login\u result=ftp\u login($conn\u id,$ftp\u user\u name,$ftp\u user\u pass);
/*如果需要更改目录,请取消注释
如果(ftp\u chdir($conn\u id,“”)){
echo“当前目录现在是:”.ftp\u pwd($conn\u id)。“\n”;
}否则{
echo“无法更改目录\n”;
}
*/
//尝试下载$server\u文件并保存到$local\u文件
if(ftp_-get($conn_-id、$local_-file、$server_-file、ftp_-BINARY)){
echo“成功写入$local\u文件\n”;
}否则{
echo“出现问题\n”;
}
//关闭连接
ftp_关闭($conn_id);

它起作用了

使用ftp_*函数有什么问题?(忽略了FTP通常应该远离的内容)。多亏了我指出了这个方向,我放弃了检查PHP FTP的功能,。。我尝试了类似于
file\u put\u contents(“out.rar”,file\u get\u contents($url,false,$context))没有成功,我现在就试试ftp_*funcs!谢谢,我试过了,但是我在Wireshark中得到了相同的输出。。我使用的代码与您给我的代码完全相同..不,但我第一次尝试时使用的是完整路径存档,现在以您的示例为例,我只需更改一些内容,重新排列curlopt的指令,并删除一些其他内容,但没有成功