首页->正文

通过curl实现远程文件下载

2012-09-15 -Web开发 标签: php linux

好久不更新博客了:)

由于种种限制原因远程登录后不能通过sz下载文件,sftp也不能登录,就考虑通过80端口来传递文件。但缺点是必须要在下载的机器上安装web服务器,当然做网站开发的一般本地都有开发环境。

先看下curl如何传递参数
-F表示以POST方式传递数据 文件以@开头 如以下例子,表示把当前目录的testfile.xt文件发送到http://192.168.0.1/rec.php,其中file为表单中上传文件的name值(其实就是模拟表单的上传动作)
curl -F "file=@testfile.txt" "http://192.168.0.1/rec.php"
-F/--form <name=content> Specify HTTP multipart POST data (H)

当然还可以传递其他字符串参数
--form-string <name=string> Specify HTTP multipart POST data (H)

*更多curl说明见这里 http://curl.haxx.se/docs/httpscripting.html

本地再写个用于接收文件rec.php的文件
<?php
//脚本最初来源于http://www.w3school.com.cn/php/php_file_upload.asp,部分改造了下
$save_dir = "E:/download/ssh/";

if($_FILES["file"]["size"]){
     if ($_FILES["file"]["error"] > 0){
          echo "Return Code: " . $_FILES["file"]["error"] . "\n";
     }
     else{
          echo "Upload: " . $_FILES["file"]["name"] . "\n";
          echo "Type: " . $_FILES["file"]["type"] . "\n";
          echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb\n";
          echo "Temp file: " . $_FILES["file"]["tmp_name"] . "\n";

          if (file_exists($save_dir.$_FILES["file"]["name"])){
               echo $_FILES["file"]["name"]." already exists.\n";
          }
          else{
               move_uploaded_file($_FILES["file"]["tmp_name"], 
                   $save_dir.$_FILES["file"]["name"]);
               echo "Stored in: ".$save_dir.$_FILES["file"]["name"], "\n";
          }
     }
}
else{
     echo "Invalid file\n";
}

//EOF


下载个大点的文件(20M)试试
[test]$curl -F "file=@bigfile.log" "http://192.168.0.1/rec.php"                   
Upload: bigfile.log
Type: application/octet-stream
Size: 20480 Kb
Temp file: C:\Windows\Temp\php14F2.tmp
Stored in: E:/download/ssh/bigfile.log

校验下完整否
[test]$md5sum ./bigfile.log
1ea657b667b87ca7fe7f3c88897db61a  ./bigfile.log

D:\>php -r "echo md5_file('E:\download\ssh\bigfile.log');"
1ea657b667b87ca7fe7f3c88897db61a

完全一致!

接下来做成个脚本直接传递参数形式的
[test]$vim sendfile.sh

#!/bin/sh
if test -z "$1";
then
        echo  "usage: senfile.sh filename"
        exit
fi
curl -F "file=@$1" "http://192.168.0.1/rec.php"

[test]$chmod a+x sendfile.sh

测试下
[test]$./sendfile.sh sendfile.sh
Upload: sendfile.sh
Type: application/octet-stream
Size: 0.13671875 Kb
Temp file: C:\Windows\Temp\php1A43.tmp
Stored in: E:/download/ssh/sendfile.sh 

OK, 以后传参数就行了!
当然还有改进空间,例如把校验的值同时发过去,远端接收到文件在进行对比,当文件存在的时候可以自动改名,或者直接覆盖。

下一篇 php版的java-hashCode

上一篇 mongodb使用注意事项汇总

相关文章

VirtualBox中安装Ubuntu Server

Ubuntu下编译安装PHP

使用curl_multi_init并发请求

php增加Last-Modified为何无效

用xhprof分析php代码

文章分类

开发小提示

  • 1:Mongodb中通过db.yourCollectionName. dataSize()查看某个文档的大小
  • 2:linux下用reset命令恢复查看二进制文件导致的命令行乱码
  • 3:查看MySQL表的索引情况show index from tableName
  • 更多...

交流

  • wangnow(a)126.com