此代码
$user = 'user';
$pass = 'password';
$filename = 'text.txt';
error_reporting(E_ALL);
ini_set('display_errors', 1);
$ch = curl_init();
$localfile = 'text.txt';
$fp = fopen($localfile, 'r');
curl_setopt($ch, CURLOPT_URL, 'sftp://$user:$pass@myserver.com/upload/$filename');
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile));
curl_exec ($ch);
$error_no = curl_errno($ch);
curl_close ($ch);
if ($error_no == 0) {
$error = 'File uploaded succesfully.';
} else {
$error = 'File upload error.';
}
echo $error.' '.$error_no;
给了我这个错误:
文件上传错误。 7(无法将文件写入磁盘)
我的要求很简单,我只需要使用curl在实时服务器上上传text.txt
文件。
答案 0 :(得分:2)
因此,对于诊断SSH / SFTP问题,我认为phpseclib, a pure PHP SFTP implementation是最好的方法。方法如下:
<?php
include('Net/SFTP.php');
define('NET_SFTP_LOGGING', NET_SFTP_LOG_COMPLEX);
$sftp = new Net_SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
exit('Login Failed');
}
$sftp->put('text.txt', 'text.txt', NET_SFTP_LOCAL_FILE);
echo $sftp->getSFTPLog();
?>
特别是,对phpseclib有用的是它能够创建日志文件,以便您可以看到正在发生的事情。
我认为它也更容易使用,哈哈,但这取决于你。
答案 1 :(得分:1)
也许这个link可以帮到你,
有一些使用CURL上传文件的不同方法的例子。
或试试这个
$ch = curl_init();
$localfile = ‘sample.txt’;
$fp = fopen($localfile, ‘r’);
curl_setopt($ch, CURLOPT_URL, ‘sftp://user:pass@ftp.remote.com/’.$localfile);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile));
curl_exec ($ch);
$error_no = curl_errno($ch);
curl_close ($ch);
if ($error_no == 0) {
$error = ‘File uploaded succesfully.’;
} else {
$error = ‘File upload error.’;
}
答案 2 :(得分:1)
这个问题的答案今天帮助了我。
我只是想指出,由于您使用单引号,'sftp://$user:$pass@myserver.com/upload/$filename'
中的变量永远不会被解释。您应该使用双引号或将您的变量连接到单引号字符串。
答案 3 :(得分:0)
我还遇到了一个问题,即我用作起点的脚本不起作用。所以我只设置了CURLOPT_VERBOSE并将curl_error结果添加到输出中。通过这种方式,我意识到,我的情况下curl没有启用ssh支持,可以通过使用ssh支持重新出现(=在其他系统上重新构建,我在gentoo上)来解决此问题。此外,代码中的单引号还会阻止正确的变量替换。 解决了这些问题,并且很少输入错误之后,使用我的测试证书和主机,我的函数结果现在看起来像这样:
文件成功上传。 0