5

次のCURLを変換しようとしています。

curl -X POST \
  -H "Content-Type: image/jpeg" \
  --data-binary '@myPicture.jpg' \
  https://api.parse.com/1/files/pic.jpg

PHPへ:

$ch = curl_init();
$data = array('myPicture.jpg' => "@myPicture.jpg");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $data);

$headers = array();
$headers[] = "Content-Type: image/jpeg";
curl_setopt ($ch, CURLOPT_HTTPHEADER, $headers);

curl_setopt ($ch, CURLOPT_URL, 'https://api.parse.com/1/files/myPicture.jpg');

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt ($ch, CURLOPT_VERBOSE, true);

$response = curl_exec($ch);
curl_close($ch);

しかし、私の応答はfalseです。これが私が得たものですprint_r(curl_getinfo($ch), true)

Array
(
    [url] => https://api.parse.com/1/files/myPicture.jpg
    [content_type] => 
    [http_code] => 0
    [header_size] => 0
    [request_size] => 0
    [filetime] => -1
    [ssl_verify_result] => 20
    [redirect_count] => 0
    [total_time] => 0.28
    [namelookup_time] => 0.187
    [connect_time] => 0.218
    [pretransfer_time] => 0.28
    [size_upload] => 0
    [size_download] => 0
    [speed_download] => 0
    [speed_upload] => 0
    [download_content_length] => -1
    [upload_content_length] => -1
    [starttransfer_time] => 0
    [redirect_time] => 0
)

これが機能しない理由について何かアイデアはありますか?ありがとう!

4

1 に答える 1

10

ssl_verify_result値は20、ドキュメントによると、これは次のことを意味します。

ローカル発行者証明書を取得できません

ローカルで検索された証明書の発行者証明書が見つかりませんでした。これは通常、信頼できる証明書のリストが完全ではないことを意味します。

最初にピアを確認せずに試すことができます。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

それが機能する場合は、最近のCAバンドルのパスを指定する必要があります。参照:http ://curl.haxx.se/docs/sslcerts.html


また、アップロードしようとしているファイルが予期されたフォルダーにあるかどうかを確認する必要があります。指定CURLOPT_VERBOSE = 1した場合は、これについても警告する必要があります。


アップデート

APIドキュメントを確認した後、サービスは定期的なファイルのアップロードを期待していません(つまり"multipart/form-data")。むしろ、生のアップロードが必要です。

これは、次の方法で実行できます。

curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents('myPicture.jpg'));
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: image/jpeg"));

更新2 を使用して何かを渡すCURLOPT_POSTFIELDSと、暗黙的にrequestメソッドがPOSTContent-Typeに設定されapplication/x-www-form-urlencodedます。配列を渡すとき、値はファイルのアップロードを示すために始まる場合があり@ます(そうすることで、暗黙的にに変更する必要もありますContent-Typemultipart/form-data

コマンドラインでは、いくつかの場所でをcurl許可します。@

  1. --data-binary生のバイナリデータを含むファイルを指定するために使用する
  2. --dataまたはを使用して--data-ascii、URLエンコードされたデータを含むファイルを指定します
  3. --Fまたはを使用して--form

CURLOPT_POSTFIELDS後者は、配列をプレフィックスに渡してプレフィックスを使用するのと同じように動作し@ます。他の2つは、文字列を渡すのと同じように動作します。

于 2012-06-19T04:31:47.660 に答える