2012-05-07 22 views
2

csvファイルといくつかのPOSTフィールドを、PHPとCurlを使用したマルチパートPOSTを使用してREST APIエンドポイントにHTTP PUTする必要があります。CurlとPHPを使用したRESTエンドポイントへのマルチプルPUTアップロード

ファイルアップロードの内容は、変数$ listに格納されます。もう1つのエンドポイントは$ urlです。

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_PUT, true); 
$post = array(
    //Other Post fields array 
); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 

$fh = fopen('php://memory', 'rw'); 
fwrite($fh, $list); 
rewind($fh); 
curl_setopt($ch, CURLOPT_INFILE, $fh); 
curl_setopt($ch, CURLOPT_INFILESIZE, strlen($list)); 
$response = curl_exec($ch); 

上記のコードでは、唯一の問題は、他のエンドポイントは、ファイルアップロードのための特定のフィールド名を必要とすることで動作しているようです。ファイル名を設定するには?

私は何か間違っていますか?

これはFYIことがmultipart/form-dataである彼らはAPI

Content-Disposition: form-data; name="list[csv]"; filename="RackMultipart20110923-63966-hfpyg" 
Content-Length: 33 
Content-Type: text/csv 
Content-Transfer-Encoding: binary 

xxxx 
yyyy 
zzzz 
-------------MultipartPost 
Content-Disposition: form-data; name="list[list_type]" 

Blacklist 
-------------MultipartPost-- 
+1

マルチパートデータのPUTが間違った方法であることにご注意ください。 PUTリクエストは、サーバー上のファイルの内容に直接関係していると思われます。マルチパートリクエストをPUTするのはあまり意味がありません。代わりにPOSTする必要はありませんか? POSTing ['multipart/form-data'](http://en.wikipedia.org/wiki/MIME#Form_Data)はここでもっと意味をなさないでしょう...ファイルは' Content-Disposition :添付ファイル。 name = "フィールド名";ファイル名= "ファイル名"ヘッダ – DaveRandom

+0

1. RESTエンドポイントにはPUTが必要です。 2. POSTを使ってファイルをアップロードするには、POST配列のファイル名を指定する必要があります。変数からアップロードする必要があります。おそらく中間的な解決策は、変数から一時ファイルを作成してアップロードすることですが、私はこれをやりたくありません。 –

+0

送信しているコンテンツのMIMEタイプは何ですか?エンドポイントのAPIドキュメントを教えてください。 'multipart/*'型の何らかの形式を使わずにファイル名を指定する方法は分かりません。この場合は必要な 'Content-Disposition'ヘッダです。メッセージ本体を自分で構築する必要があるかもしれません。 – DaveRandom

答えて

5

に言及しているPUT形式です。あなたは自分自身を構築する必要があります私は思う、私はcURLはPUT要求でそのような要求を構築するために作ることができるとは思わない。しかし、これは深刻な問題ではありません:あなたはこれで何か問題があれば

<?php 

    function recursive_array_mpfd ($array, $separator, &$output, $prefix = '') { 
    // Recurses through a multidimensional array and populates $output with a 
    // multipart/form-data string representing the data 
    foreach ($array as $key => $val) { 
     $name = ($prefix) ? $prefix."[".$key."]" : $key; 
     if (is_array($val)) { 
     recursive_array_mpfd($val, $separator, $output, $name); 
     } else { 
     $output .= "--$separator\r\n" 
       . "Content-Disposition: form-data; name=\"$name\"\r\n" 
       . "\r\n" 
       . "$val\r\n"; 
     } 
    } 
    } 

    // This will hold the request body string 
    $requestBody = ''; 

    // We'll need a separator 
    $separator = '-----'.md5(microtime()).'-----'; 

    // First add the postfields 
    $post = array(
    //Other Post fields array 
); 
    recursive_array_mpfd($post, $separator, $requestBody); 

    // Now add the file 
    $list = "this,is,some,csv,data"; // The content of the file 
    $filename = "data.csv"; // The name of the file 
    $requestBody .= "--$separator\r\n" 
       . "Content-Disposition: form-data; name=\"list[list_type]\"; filename=\"$filename\"\r\n" 
       . "Content-Length: ".strlen($list)."\r\n" 
       . "Content-Type: text/csv\r\n" 
       . "Content-Transfer-Encoding: binary\r\n" 
       . "\r\n" 
       . "$list\r\n"; 

    // Terminate the body 
    $requestBody .= "--$separator--"; 

    // Let's go cURLing... 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_PUT, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $requestBody); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: multipart/form-data; boundary="'.$separator.'"' 
)); 
    $response = curl_exec($ch); 

、cURLの要求の前echo $requestBody;を試してみて、あなたはそれが期待するように見えることを確認してください。

+0

+ Nice答え..... – Baba

関連する問題