2017-11-17 18 views
0

このウェブサイトのこのトピックに関する多くの回答はありますが、何も役に立ちません。php curl multipart/form-data:ファイルの内容が投稿されていません

私はボックスにファイルを投稿しようとしています(クラウドストレージ)。簡単なはずですが、そうではありません。

私はRequestBinを使用してデバッグします。

コマンドラインでカールを使用して、それが(ファイルがボックスに投稿された)素晴らしい作品:

curl https://requestb.in/1bw1 -H "Authorization: Bearer supersecret" -H "Content-Type: multipart/form-data" -X POST -F [email protected]/tmp/testfile.pdf 

同じことをやろうとして応答がないと(それが失敗したカールPHPで(ボックスにファイルをアップロード)ファイルコンテンツが見つからないことを意味します)。

私のPOSTが異なって見えることもRequestBinにあります。

カールCLI(正しい):

RAW BODY

-------------------------- ---- cd86e864290b コンテンツの処理:フォームデータ。

{"name": "testfile.pdf"、 "parent":{"id": "40801665641"}} --------------- --------------- cd86e864290b コンテンツの処理:フォームデータ。 name = "file";ファイル名= "testfile.pdf" のContent-Type:アプリケーション/ octet-streamの

RIFFäÊWAVEfmt...

カールPHP(正しくない):

RAW BODY

------------------------------ 7ab3fffab8c6 コンテンツの処理:フォームデータ。

{"name": "testfile.pdf"、 "parent":{"id": "42035106321"}} --------------- --------------- 7ab3fffab8c6 コンテンツの処理:フォームデータ。名前= "ファイル"

@ ../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) 

私はただの正しい形式を取得していないようです私が投稿したいファイル。

答えて

0

あなたが探しているのは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); 

マルチパート/フォームデータまたはアプリケーション/ X-WWW-URLエンコードエンコーディングを使用する場合、手動でContent-Typeヘッダを設定しない、また、カールが自動的に適切なヘッダーを設定し、あなたとは異なります、カールはそうする際に何のタイプミスもしません。

また、curl_setopt_arrayを返すブール値(偽)のオプションを設定する問題があった場合、あなたはこれらのエラーを無視してはならない、したがって、私が代わりにこの機能を使用することをお勧めします、それは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)); 
    } 
} 
に任意のカールにsetoptエラーを変換し、

とprotipは、カールコードをデバッグするときにCURLOPT_VERBOSEを有効にします。

+0

ありがとうございます。私はCURLFile()オブジェクトを知っています。これを使用する私の唯一の問題は、私はPHPのバージョン5.4.36を持っていることです。だから、これは私のための選択肢ではありません。 – user2795648

+0

@ user2795648あなたのPHPバージョンは古く、安全でなく、重大なセキュリティアップデート(バグフィックスやアップデートなど)を受け取っていないので、自分で好きで5.6にアップグレードしてください。 (CURLOPT_SAFE_UPLOADを使わないで)5.5+で動作しませんでしたが、それは5.4のバージョンは 'CURLOPT_POSTFIELDS =>配列( 'ファイル' => '@/tmp/testfile.pdf' ) PHP 7.0以降で動作します。 – hanshenrik

関連する問題