我想使用cURL将文件上传到其他服务器。我已经阅读了很多类似的问题,但我没有得到任何解决我的问题的方法。这是我现在的代码:
ftp_server = 'ftps://xxxxx.com';
$ftp_user = 'user';
$ftp_password = 'password';
$ftp_certificate = 'cert.pem';
$source_file = 'tosend.txt';
$destination_file = '/directory/received.txt';
if(!file_exists($source_file)) {
die('no file');
}
$file = fopen($source_file, 'r');
$ch = curl_init();
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
curl_setopt($ch, CURLOPT_URL, $ftp_server . $destination_file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, $ftp_user . ':' . $ftp_password);
curl_setopt($ch, CURLOPT_TIMEOUT, 200);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 200);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_INFILE, $file);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($source_file));
//SSL stuff
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, $ftp_certificate);
//curl_setopt($ch, CURLOPT_FTP_SSL, CURLFTPSSL_TRY);
//curl_setopt($ch, CURLOPT_FTPSSLAUTH, CURLFTPAUTH_TLS);
$upload_result = curl_exec($ch);
$upload_info = curl_getinfo($ch);
$error_no = curl_errno($ch);
$error_msg = curl_error($ch);
curl_close ($ch);
fclose($file);
if ($error_no == 0) {
echo 'File uploaded succesfully.';
} else {
echo 'File upload error:' . $error_msg . ' | ' . $error_no;
}
var_dump($upload_info); //debug
die('the end');
当我运行此脚本时,它会继续运行200秒,并以:
响应//error_no
File upload error:SSL connection timeout | 28
//curl_getinfo
array(19) {
["url"]=> string(49) "ftps://xxxxx.com/directory/received.txt"
["http_code"]=> int(150)
["header_size"]=> int(0)
["request_size"]=> int(0)
["filetime"]=> int(-1)
["ssl_verify_result"]=> int(0)
["redirect_count"]=> int(0)
["total_time"]=> float(200.099361)
["namelookup_time"]=> float(0.002149)
["connect_time"]=> float(0.003154)
["pretransfer_time"]=> float(0.110952)
["size_upload"]=> float(0)
["size_download"]=> float(0)
["speed_download"]=> float(0)
["speed_upload"]=> float(0)
["download_content_length"]=> float(0)
["upload_content_length"]=> float(0)
["starttransfer_time"]=> float(0)
["redirect_time"]=> float(0)
}
//die
the end
有趣的是,这个文件出现在服务器上,但总是有320B并且包含难以理解的字符。这就是服务器在日志中告诉我的事情:
Sep 17 20:56:58 xxxxx vsftpd [2613]:[user] OK LOGIN:客户端“yyyyy”
Sep 17 20:56:58 xxxxx vsftpd [2618]:[user] FTP响应:客户端“yyyyy”,“230登录成功。”
Sep 17 20:56:58 xxxxx vsftpd [2618]:[user] FTP命令:客户端“yyyyy”,“PBSZ 0”
Sep 17 20:56:58 xxxxx vsftpd [2618]:[user] FTP响应:客户端“yyyyy”,“200 PBSZ设置为0。”
Sep 17 20:56:58 xxxxx vsftpd [2618]:[user] FTP命令:客户端“yyyyy”,“PWD”
Sep 17 20:56:58 xxxxx vsftpd [2618]:[user] FTP响应:客户端“yyyyy”,“257”/“”
Sep 17 20:56:58 xxxxx vsftpd [2618]:[user] FTP命令:客户端“yyyyy”,“CWD目录”
Sep 17 20:56:58 xxxxx vsftpd [2618]:[user] FTP响应:客户端“yyyyy”,“250目录已成功更改。”
Sep 17 20:56:58 xxxxx vsftpd [2618]:[user] FTP命令:客户端“yyyyy”,“EPSV”
Sep 17 20:56:58 xxxxx vsftpd [2618]:[user] FTP响应:客户端“yyyyy”,“229进入扩展被动模式(||| 65024 |)。”
Sep 17 20:56:58 xxxxx vsftpd [2618]:[user] FTP命令:客户端“yyyyy”,“TYPE I”
Sep 17 20:56:58 xxxxx vsftpd [2618]:[user] FTP响应:客户端“yyyyy”,“200切换到二进制模式。”
Sep 17 20:56:58 xxxxx vsftpd [2618]:[user] FTP命令:客户端“yyyyy”,“STOR received.txt”
Sep 17 20:56:58 xxxxx vsftpd [2618]:[user] FTP响应:客户端“yyyyy”,“150 Ok发送数据。”
Sep 17 21:03:38 xxxxx vsftpd [2618]:[user] OK UPLOAD:客户端“yyyyy”,“/ directory / received.txt”,320字节,0.00Kbyte / sec
Sep 17 21:03:38 xxxxx vsftpd [2618]:[user] FTP响应:客户端“yyyyy”,“226传输完成。”
我不是cURL专家,但我认为这是在代码中添加/删除一些选项的情况,欢迎任何帮助。
答案 0 :(得分:0)
尝试添加并测试此选项:
curl_setopt($ch, CURLOPT_PORT, 990); // port for ftp ssl
...
curl_setopt($ch, CURLOPT_USE_SSL, TRUE);
...
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
...