2016-12-07 16 views
2

イメージファイルをアップロードします。ターゲットは、oAuth2自動化を使用したREST APIエンドポイントです。私は何かをアップロードすることができましたが、サーバー上のファイルを開くと、破損しています。サイズがソースファイルと一致しませんでした。カールをアップロードした後に破損したファイル

これは私が使用するコードです:

<?php 
$file = 'example.jpg'; 

$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$finfo = finfo_file($finfo, __DIR__.'/'.$file); 

$ending = "\r\n"; 

$boundary = md5(microtime()); 
$fullBoundary = sprintf("--%s%s", $boundary, $ending); 

$body = ''; 
$body .= $fullBoundary; 
$body .= "Content-Disposition: form-data; name=\"image\"; filename=\"$file\"".$ending; 
$body .= "Content-Type: $finfo".$ending; 
$body .= "Content-Transfer-Encoding: base64".$ending.$ending; 
$body .= chunk_split(base64_encode(file_get_contents(__DIR__.'/'.$file))).$ending; 
$body .= "--".$boundary."--".$ending.$ending; 
$ch = curl_init(); 
curl_setopt(
    $ch, 
    CURLOPT_HTTPHEADER, 
    [ 
     'Authorization: Bearer token...', 
     "Content-Type: multipart/form-data; boundary=".$boundary, 
    ] 
); 
curl_setopt($ch, CURLOPT_URL, "http://api.example.com/upload"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLINFO_HEADER_OUT, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $body); 
curl_setopt($ch, CURLOPT_VERBOSE, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/1.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0'); 
$curl_response = curl_exec($ch); 
print_r(curl_getinfo($ch)); 
print_r($curl_response); 
curl_close($ch); 

誰もがそれで私を助けることができますか?

P.S.私は "@"表記法と\ CurlFileを使ってみたが、$ _FILES配列は空であったので、私はリクエスト本体全体を手動で作成したのだと言うことを忘れないでください。 curlopt_postfieldsためPHP manualから

答えて

0

がファイルを投稿し、先頭に追加@と、ファイル名と完全なパスを使用します。 ファイルタイプは、 というファイル名の後に '; type = mimetype'の形式で明示的に指定することができます。このパラメータは、どちらか は、値としてキーとフィールドのデータとしてフィールド名を持つ「PARA1 = val1と& PARA2 = val2の& ...」または として配列のようなURLエンコード文字列として渡すことができます。値 が配列の場合、Content-Typeヘッダーは multipart/form-dataに設定されます。 PHP 5.2.0以降、ファイル@ が@接頭辞付きでこのオプションに渡された場合、値は配列でなければなりません。 PHP 5.5.0以降、接頭辞@ は廃止され、CURLFileを使用してファイルを送信することができます。 によって@で始まる値を安全に渡すために、プレフィックス@ を無効にすると、CURLOPT_SAFE_UPLOADオプションがTRUEに設定されます。

このようにファイルを送信してください。

$file = 'example.jpg'; 
$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$finfo = finfo_file($finfo, __DIR__.'/'.$file); 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_POSTFIELDS, array('file' => '@'.realpath($file).';filename='.basename($file).';type='.$finfo)); 
curl_setopt(
    $ch, 
    CURLOPT_HTTPHEADER, 
    [ 
     'Authorization: Bearer token...', 
     "Content-Type: multipart/form-data; boundary=".$boundary, 
    ] 
); 
curl_setopt($ch, CURLOPT_URL, "http://api.example.com/upload"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLINFO_HEADER_OUT, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_VERBOSE, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/1.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0'); 
$curl_response = curl_exec($ch); 
print_r(curl_getinfo($ch)); 
print_r($curl_response); 
curl_close($ch); 
+0

私はPHP 7.1を使用しています。この表記はもはやサポートされていません。私は\ CurlFileを試しましたが、$ _FILES配列はサーバー側で空になっていました – Vail

+0

@Vailその理論を裏付ける証拠は何ですか?それが7で非難されたならば、ドキュメントはそれに気付いていただろうが、それはそうしなかった。これがその仕方です。 –

+0

まあ、私はこの表記がPHP7では動作しないと読んだ場所を見つけることができませんが、間違いなく推奨されていません。 "PHP 5.5.0以降、@接頭辞は推奨されず、CURLFileを使ってファイルを送ることができます。@接頭辞は、CURLOPT_SAFE_UPLOADオプションを設定することで@で始まる値を安全に渡すために無効にすることができますTRUEにします。 – Vail

1

私はこれでこの作品を作るために管理いくつかの時間後:なぜ「ノーマル」な方法ドン

$body .= "Content-Transfer-Encoding: multipart/form-data".$ending.$ending; 
$body .= file_get_contents(__DIR__.'/'.$file).$ending; 

今、ファイルはサーバ側で表示され、それが破損していないが、これはまだ答えていません。仕事はありません。もし誰かがここで何が起こっているのかを説明できれば幸いです:)

関連する問題