PHP和cURL - 包含文件和文本的Multiform请求

时间:2015-07-28 15:07:56

标签: php curl upload

我需要发送一个包含要上传的文件的cURL请求以及一个JSON字符串。我可以在发送JSON时获得格式正确的请求,但该文件将其丢弃。

    $postData = array(
        'JSON'=> json_encode($jsonParams),
        $reference => '@'.$tmp_file_path
    );

    //Borrowed function from: http://scraperblog.blogspot.com/2013/07/php-curl-multipart-form-posting.html
    function multipart_build($fields, $boundary){
        $retval = '';
        foreach($fields as $key => $value){
            $retval .= "--$boundary\nContent-Disposition: form-data; name=\"$key\"\n\n$value\n";
        }
        $retval .= "--$boundary--";
        return $retval;
    }

    $boundary = "--requestboundary-xxx";
    $request = $this->multipart_build($postData,$boundary);

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // stop verifying certificate
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: multipart/form-data; boundary=$boundary"));
    curl_setopt($curl, CURLOPT_URL, $target);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $request);
    $response = curl_exec($curl);

    $info = curl_getinfo($curl);
    curl_close($curl);

$ reference需要绑定到$ jsonParams中的值,这样接收服务器就可以确保上传的文件附加到相应的数据字符串包中。

/////////////////////////////////////////////// /////////////

Marc B评论后更新

/////////////////////////////////////////////// /////////////

所以我的第一个方法是不使用我自己的多部分。我使用multipart的原因至少是我从服务器获得响应。这是原始代码。

    $curl_file_object = curl_file_create($attachmentFile['tmp_name'], $attachmentFile['type'], $reference);

    $postData= array(
        'JSON'=> json_encode($jsonParams),
        $reference => $curl_file_object,
    );

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $target);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // stop verifying certificate
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HEADER, true);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: multipart/form-data;"));
    curl_setopt($curl, CURLOPT_POST, true); // enable posting
    curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); // post data
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // if any redirection after upload

    $response = curl_exec($curl);
    $info = curl_getinfo($curl);
    curl_close($curl);
    debug($info);

有了这个,我得到了:

[url] => --------
[content_type] => 
[http_code] => 0
[header_size] => 0
[request_size] => 0
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.031
[namelookup_time] => 0
[connect_time] => 0.031
[pretransfer_time] => 0
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => -1
[upload_content_length] => -1
[starttransfer_time] => 0
[redirect_time] => 0
[redirect_url] => 
[primary_ip] => --------
[certinfo] => Array
    (
    )

[primary_port] => --------
[local_ip] => --------
[local_port] => --------

对于多部分我至少得到了400。

2 个答案:

答案 0 :(得分:0)

不要建立自己的多部分。 Curl完全有能力为你做到这一点:

curl_setopt($curl, CURLOPT_POSTFIELDS, $postData);

它会采取一个阵列并自动完成所需的任何事情。

如果您使用的是PHP 5.5+,那么您也可以使用curlfile作为文件部分,而不需要@黑客。

答案 1 :(得分:0)

使用 CURLFile 而不是curl_file_create()修复了问题。即使他们应该是相同的......