$_FILES为空,使用curl进行文件上传

3

我一直在为这个问题苦苦挣扎。我感觉我的问题可能很傻,但我就是想不出来。

我有一个代理脚本,它处理所有事情(POST数据和上传)。

当我在后端服务器上打印 print_r($_FILES) 时,它是一个空数组,而 $_POST 包含文件路径。

$ch = curl_init();
$options = array( 
    CURLOPT_HEADER => 1, 
    CURLOPT_HTTPHEADER => array( 
        "Host: {$host}", 
        "Cache-Control: no-cache"
    ), 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_SSL_VERIFYHOST => false, 
    CURLOPT_SSL_VERIFYPEER => 0, 
    CURLOPT_URL => "http://{$this->config->ipAddress}{$url}", 
    CURLOPT_FOLLOWLOCATION => false, 
    CURLOPT_COOKIE => $cookie_string, 
    CURLOPT_USERAGENT => $_SERVER["HTTP_USER_AGENT"]
);

if (! empty($_POST)) {
    if (! empty($_FILES)) {
        //$options[CURLOPT_HTTPHEADER][] = "Content-type: multipart/form-data";

        $files = "";
        foreach ($_FILES as $fid => $file) {
            $files .= "{$fid}=@" . $file["tmp_name"] . ";type={$file["type"]};name={$file["name"]}&";
        }
    }

    $postString = (! empty($files) ? $files : '') . http_build_query($_POST);
    $options[CURLOPT_POST] = 1;
    $options[CURLOPT_POSTFIELDS] = $postString;
}

curl_setopt_array($ch, $options);
$output = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

我使用http_build_query而不是直接传递一个数组的原因是因为我们会遇到多维数组。
谢谢!
1个回答

5
我敢打赌您的表单enctype不是"multipart/form-data",因为您没有将post字符串作为数组传递。
请查看http://php.net/manual/en/function.curl-setopt.php并搜索 "CURLOPT_POSTFIELDS"。下面是该页面的摘录:
如果值是数组,则Content-Type header将设置为multipart/form-data。从PHP 5.2.0开始,如果使用@前缀将文件传递给此选项,则值必须是数组。
您可以通过设置curl选项 "curl_setopt($ch, CURLOPT_VERBOSE, TRUE); "来了解curl正在发生什么,并在 "curl_exec($ch);"后使用 "print_r( curl_getinfo($ch) );",它将输出关于请求和响应的所有信息。

啊,我不知道你必须提供一个数组来处理文件。谢谢!因为我之前使用了多维数组,所以我走了另一条路线。所以我写了一个函数来将其展平。 :) - Branden Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接