【问题标题】:Php upload image to remote server with cURLphp 使用 cURL 将图像上传到远程服务器
【发布时间】:2016-03-04 00:25:57
【问题描述】:

我想在 php 中使用 cURL 将图像上传到远程图像服务器。我有这段代码,它在网络服务器上:

<form enctype="multipart/form-data" encoding="multipart/form-data" method="post" action="webform.php">
<input name="somevar" type=hidden value='.$somevar.'>
<input name="uploadfile" type="file" value="choose">
<input type="submit" value="Upload">
</form>

和:

if (isset($_FILES['uploadfile']) ) {

 $filename  = $_FILES['uploadfile']['tmp_name'];
 $handle    = fopen($filename, "r");
 $data      = fread($handle, filesize($filename));
 $POST_DATA = array(
   'somevar' => $somevar,
   'uploadfile' => $data
 );
 $curl = curl_init();
 curl_setopt($curl, CURLOPT_URL, 'http://1.1.1.1/receiver.php');
 curl_setopt($curl, CURLOPT_TIMEOUT, 30);
 curl_setopt($curl, CURLOPT_POST, 1);
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($curl, CURLOPT_POSTFIELDS, $POST_DATA);
 $response = curl_exec($curl);
 curl_close ($curl);
 echo $response;

}

在图像服务器上,我有一个图像上传处理 php 文件,它在 localhost 上运行良好,但我想在远程服务器上使用它。这就是我在receiver.php中处理上传图片文件的方式:

move_uploaded_file($_FILES['uploadfile']['tmp_name'], $file)

我想直接把图片文件传给远程服务器脚本,这样我就不需要重写整个上传脚本了。我尝试将图像名称、类型、大小作为发布变量发布,但我没有得到 ['tmp_name'],因为它不在本地主机上。

我该如何解决这个问题?谢谢大家的帮助!

【问题讨论】:

    标签: php curl remote-server


    【解决方案1】:

    这是一个可能的解决方案;

    • 在您的网络服务器上处理上传并将上传的文件移动到本地临时位置
    • 然后向远程服务器发出 curl POST 请求,并告诉它上传的文件名和数据是什么;作为 base64_encoded 字符串
    • 远程服务器脚本将上传作为标准 http post 接收
    • 它现在要做的就是解码文件数据,将其保存为指定的文件名

    所以,这就是解决方案的样子:

    抱歉,我没有对此进行测试,但它应该可以工作。

    index.php

    <?php
    
    // Handle upload
    if(isset($_POST["submit"]))
    {
        // Move uploaded file to a temp location
        $uploadDir = '/var/www/uploads/';
        $uploadFile = $uploadDir . basename($_FILES['userfile']['name']);
        if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadFile))
        {
            // Prepare remote upload data
            $uploadRequest = array(
                'fileName' => basename($uploadFile),
                'fileData' => base64_encode(file_get_contents($uploadFile))
            );
    
            // Execute remote upload
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, 'http://1.1.1.1/receiver.php');
            curl_setopt($curl, CURLOPT_TIMEOUT, 30);
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $uploadRequest);
            $response = curl_exec($curl);
            curl_close($curl);
            echo $response;
    
            // Now delete local temp file
            unlink($uploadFile);
        }
        else
        {
            echo "Possible file upload attack!\n";
        }
    }
    
    ?>
    
    <!-- The data encoding type, enctype, MUST be specified as below -->
    <form enctype="multipart/form-data" action="index.php" method="POST">
        <!-- MAX_FILE_SIZE must precede the file input field -->
        <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
        <!-- Name of input element determines name in $_FILES array -->
        Send this file: <input name="userfile" type="file" />
        <input type="submit" value="Send File" />
    </form>
    

    然后,在 receiver.php 上,您可以执行以下操作:

    // Handle remote upload
    if (isset($_POST['fileName']) && $_POST['fileData'])
    {
        // Save uploaded file
        $uploadDir = '/path/to/save/';
        file_put_contents(
            $uploadDir. $_POST['fileName'],
            base64_decode($_POST['fileData'])
        );
    
        // Done
        echo "Success";
    }
    

    【讨论】:

    • 我会尽快尝试并回复它的进展情况。谢谢。
    • 谢谢,它有效!我想向未来的访问者指出,如果您想在代码中实现此方法,则该方法需要更高的安全性。您需要:检查扩展名、mime 类型、大小、生成随机名称、move_uploaded_file、使用 imagecreatefromjpg 和 imagejpeg php 函数。在图像服务器上,您需要:再次执行上述所有任务,以确保如果有人直接向您的图像服务器发送请求,没有人可以避免安全检查。
    猜你喜欢
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 2014-12-01
    • 2016-03-29
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多