php curl multipart / form-data:未发布的文件内容

时间:2017-11-17 13:48:07

标签: php pdf curl

本网站上有很多关于这个主题的答案,但没有人帮助我。

我正在尝试将文件发布到框(云存储)。应该很容易,但事实并非如此。

我使用RequestBin进行调试。

在命令行上使用curl时,效果很好(文件发布到Box):

curl https://requestb.in/1bw1 -H "Authorization: Bearer supersecret" -H "Content-Type: multipart/form-data" -X POST -F file=@/tmp/testfile.pdf

当尝试使用php curl尝试执行相同操作(将文件上传到Box)时,它会失败(根本没有响应,这意味着找不到文件内容)。

我还在RequestBin上看到我的POST看起来不一样。

卷曲cli(正确):

  

RAW BODY

------------------------------ cd86e864290b 内容处理:表格数据;名称= “属性”

{“name”:“testfile.pdf”,“parent”:{“id”:“40801665641”}} ------------------------------ cd86e864290b 内容处理:表格数据; NAME = “文件”;文件名= “testfile.pdf” Content-Type:application / octet-stream

RIFFäÊWAVEfmt...

卷曲php(不正确):

  

RAW BODY

------------------------------ 7ab3fffab8c6 内容处理:表格数据;名称= “属性”

{ “名称”: “testfile.pdf”, “亲本”:{ “ID”: “42035106321”}} ------------------------------ 7ab3fffab8c6 内容处理:表格数据; NAME = “文件”

@ .. / faxout / testfile.pdf ------------------------------ 7ab3fffab8c6 -

这是不一样的,我不知道如何得到相同的结果。

我的PHP代码:

$dataFile = array(
        'name' => $faxfilename,
        'parent' => array(
                'id' => $subfolderID,
            )
        );
    $PostData= array(
        'attributes' => json_encode($dataFile),
        'file' => "@$target"
    );
    $headers3=array(
        "Authorization: Bearer supersecret",
        "Content-Type: multipart/form-data"
        );

    //$filesurl = "https://upload.box.com/api/2.0/files/content";
    $filesurl = 'https://requestb.in/1bw1';
    $curlFILE = curl_init();
    curl_setopt_array($curlFILE, array(
        CURLOPT_URL => $filesurl,
        CURLOPT_HTTPHEADER => $headers3,
        CURLOPT_POST => TRUE,
        CURLOPT_POSTFIELDS => $PostData,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_SSL_VERIFYPEER => FALSE,
        CURLOPT_SSL_VERIFYHOST => FALSE
    ));

我试过了:

CURLOPT_POSTFIELDS => http_build_query($PostData),

我试过了:

'@'.realpath($target)

我似乎没有为我要发布的文件获取正确的格式。

1 个答案:

答案 0 :(得分:1)

您正在寻找CURLFile

$curlFILE = curl_init ();
curl_setopt_array ( $curlFILE, array (
        CURLOPT_URL => 'https://requestb.in/1bw1',
        CURLOPT_HTTPHEADER => array (
                "Authorization: Bearer supersecret" 
        ),
        CURLOPT_POST => TRUE,
        CURLOPT_POSTFIELDS => array (
                'file' => new CURLFile ( '/tmp/testfile.pdf' ) 
        ),
        //CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_SSL_VERIFYPEER => FALSE,
        CURLOPT_SSL_VERIFYHOST => FALSE 
) );
curl_exec($curlFILE);

另外,当使用multipart / form-data或application / x-www-urlencoded编码时,不要手动设置内容类型标题,curl会自动为你设置合适的标题,与你不同,curl won'这样做会有任何错别字。

另外,如果设置选项时出现问题,curl_setopt_array会返回bool(false),你不应该忽略这些错误,因此我建议使用此函数,它会将任何curl setopt错误转换为RuntimeException

function ecurl_setopt_array($ch, array $options) {
    if (! curl_setopt_array ( $ch, $options )) {
        throw new \RuntimeException ( 'curl_setopt_array failed. ' . curl_errno ( $ch ) . ': ' . curl_error ( $ch ) );
    }
}

和protip,在调试curl代码时,启用CURLOPT_VERBOSE。