イメージファイルをアップロードします。ターゲットは、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から
私はPHP 7.1を使用しています。この表記はもはやサポートされていません。私は\ CurlFileを試しましたが、$ _FILES配列はサーバー側で空になっていました – Vail
@Vailその理論を裏付ける証拠は何ですか?それが7で非難されたならば、ドキュメントはそれに気付いていただろうが、それはそうしなかった。これがその仕方です。 –
まあ、私はこの表記がPHP7では動作しないと読んだ場所を見つけることができませんが、間違いなく推奨されていません。 "PHP 5.5.0以降、@接頭辞は推奨されず、CURLFileを使ってファイルを送ることができます。@接頭辞は、CURLOPT_SAFE_UPLOADオプションを設定することで@で始まる値を安全に渡すために無効にすることができますTRUEにします。 – Vail