【问题标题】:Uploading file from one server to another (via HTTP POST)将文件从一台服务器上传到另一台服务器(通过 HTTP POST)
【发布时间】:2011-12-03 03:44:06
【问题描述】:

我有一个运行在客户端计算机上的 Apache 服务器,并安装了 PHP。我已经安排了一个自动创建数据库备份的任务,它工作正常。但是将备份保存在系统运行的同一个 HD 上是没有意义的,所以我必须将其发送到其他地方。

一开始,我尝试做一个PHP FTP Upload,但是客户端的防火墙阻止了所有的FTP连接,我无法解除阻止(他的公司不允许我)。

然后,我尝试使用 SMTP 将备份发送到电子邮件帐户。也没有工作。所有 SMTP 连接也被阻止(我知道...)。

我现在正尝试通过 HTTP POST REQUEST 访问网页(在我的服务器上),并将文件附加在页眉上。这应该是可能的,看到这几乎就是浏览器所做的,使用文件输入对象,对吧?我只是使用页眉发送多部分/数据。

我必须手动创建页眉吗?或者是否有任何脚本已经这样做了?

【问题讨论】:

    标签: php file upload header


    【解决方案1】:

    您可以使用curl 通过http 发送。假设您的文件是“/tmp/backup.tar.gz”,它会是:

    $ch = curl_init('http://clientserver.com/upload.php');
    $ch = curl_setopt($ch, CURLOPT_POST, true);
    $ch = curl_setopt($ch, CURLOPT_POSTFIELDS, array('file' => '@/tmp/backup.tar.gz'));
    $ch = curl_setopt($ch, CURLOPT_USERPWD, 'username:password');
    
    $result = curl_exec($ch);
    if ($result === FALSE) {
       die(curl_error($ch));
    }
    

    这就是基础。你可能需要让它更健壮一点。假设接收服务器上的上传脚本是在 php 中完成的,您将以 $_FILES['file'] 的身份访问该文件。

    【讨论】:

    • 您可能想以某种方式在 post 数组中命名文件。
    【解决方案2】:

    您可以使用this script在服务器端生成带有文件上传的POST请求(使用Content-Type: multipart/form-data)。

    在接收服务器上,您可以使用another script通过POST请求加载文件。

    但不要忘记,文件上传通常是 Web 应用程序安全性的薄弱环节,因此请在将代码应用到生产服务器之前阅读this pdf


    更新:

    思考了一分钟后,我意识到简单的php copy 函数也是将文件从一台服务器传输到另一台服务器的好方法!如果您不需要使用 POST 请求,这将起作用。

    这种方法有两个优点:

    1) 更简单

    2) 可以在post请求后进行文件传输,异步下载文件

    3) 如果传输的文件是动态生成的,可以实现

    4) 如果连接失败,服务器可以再次请求文件

    <?php
       //you can run this code in a separate process
       //don't forget to urlencode the file name if it's not encoded yet
       $remote = urlencode( $_POST['filename'] );
       $local = "tempdir_outside_your_http_root/local_file.dat"; 
       if(!copy($remote, $local)){
           throw ....
       }
       if(check_for_security($local)){
          //if all is ok, move to the desired folder
          $final = "uploads/safe_file.dat"; 
          rename($local, $final);
       }else{
          unlink($local);
       }
       //PS: this code is an example, it has strong security vulnerabilities
       //use single-use tokens so that $_POST['filename'] could not be faked 
    ?>
    

    【讨论】:

      【解决方案3】:

      您也可以使用scp 将其复制过来,这就是我使用的。您也可以将其设置为使用 cron 自动复制。

      【讨论】:

        猜你喜欢
        • 2011-11-05
        • 1970-01-01
        • 2013-12-14
        • 1970-01-01
        • 1970-01-01
        • 2017-01-23
        • 1970-01-01
        • 2016-10-18
        • 2019-01-24
        相关资源
        最近更新 更多