cURL文件上传到远程服务器

时间:2015-09-18 16:18:36

标签: php curl ftp

我想使用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专家,但我认为这是在代码中添加/删除一些选项的情况,欢迎任何帮助。

1 个答案:

答案 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); 
...