首先, 验证php的curl模块是否支持sftp,验证方法:
1 |
ldd curl.so |grep ssh |
有结果就是支持,否则就是不支持
curl 实现http文件上传的逻辑大致如下:
1 2 3 4 5 6 7 8 9 10 11 |
<?php $url = "http://phpor.net/upload.php"; $s = curl_init(); curl_setopt($s,CURLOPT_RETURNTRANSFER,true); curl_setopt($s,CURLOPT_URL,$url); curl_setopt($s, CURLOPT_POST, true); $file = new CURLFile('text.txt'); curl_setopt($s, CURLOPT_POSTFIELDS, array("file" => $file)); echo curl_exec($s); echo curl_error($s); |
curl 实现sftp文件上传的方式是否可以如法炮制?
原以为修改下url地址(如: sftp://username:password@phpor.net/test.txt ) 就可以搞定,实际不然:(毕竟POSTFILDS 的内容就不太好解释),正确的姿势如下:
1 2 3 4 5 6 7 8 9 10 11 |
<?php $url = "sftp://username:password@phpor.net/"; $s = curl_init(); curl_setopt($s,CURLOPT_RETURNTRANSFER,true); curl_setopt($s,CURLOPT_URL,$url."/upload/text.txt"); curl_setopt($s, CURLOPT_UPLOAD, true); # 或者:curl_setopt($s, CURLOPT_PUT, true); curl_setopt($s, CURLOPT_INFILE, fopen("text.txt", "r")); echo curl_exec($s); echo curl_error($s); |
注意:
- 其中的 curl_setopt($s, CURLOPT_UPLOAD, true); 或 curl_setopt($s, CURLOPT_PUT, true); 是要有的,且: 换做curl_setopt($s, CURLOPT_PUT, true); 是不行的
- CURLOPT_INFILE 是一个文件流,不能是文件名
有时候,ssh2模块使用起来更加方便,但是真的没有的时候,curl也不算太复杂;另外,ssh2 附带注册了一个stream wrapper, 当安装了ssh2模块时,你甚至可以 fopen(“sftp://….”)