1

PhotobucketAPIを使おうとしています。私は、JavaScriptでUIを記述してから、基本的にPhotobucketサーバーへのプロキシとして機能するサーバーへのAJAX呼び出しを使用することを計画しています。Photobucket APIのconsumer_secretが公開されないように、サーバーをプロキシとして使用しています。ただし、PHPを使用して写真をアップロードするのに問題があります。アルバムの追加や削除などの認証されたメソッドを含め、APIから他のメソッドを機能させることができました。私は参照してきました

http://pic.pbsrc.com/dev_help/WebHelpPublic/Content/Methods/Album/Upload%20Media%20to%20an%20Album.htm

http://pic.pbsrc.com/dev_help/WebHelpPublic/Content/Examples/Uploading%20Media.htm

私はPHPでファイルのアップロードを行ったことがありませんが、ここやWeb上の他のさまざまな場所にあるいくつかの投稿を読みました。基本的に、ユーザー、アルバム名、ファイルをサーバー上のphpスクリプトに投稿するhtmlフォームを持つテストページがあります。フォームはmultipart/form-dataとしてエンコードされます。

POSTリクエストがサーバー上のページに到達したとき。私のサーバーは、ユーザーセットのトークンを検索し、基本的なoauthパラメーターを設定します。次に、oauthに必要なすべてのことを、他の方法(すべてが機能する方法)で行う方法とまったく同じように行います。

基本文字列からuploadfileパラメーターを除外し、oauth署名を生成するときにメソッドPOSTを使用しています。uploadfileパラメーターには、次を使用します

$params['uploadfile']= '@'.$_FILES['file']['tmp_name'];

それから私はそのようにカールリクエストを設定しました

$ch = curl_init($url.$resource);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params); // Note $params is an array

$response = curl_exec($ch);

curl_close($ch);

私も追加してみました

curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible);');

ただし、このPhotobucketがすべて戻ってきて、「認証に失敗しました。署名チェックに失敗しました」と表示された後

私は私のベースストリングを見ました、そしてそれはうまく見えます。これが例です。さまざまなトークンの実際の値を編集しました。

POST&http%3A%2F%2Fapi.photobucket.com%2Falbum%2Fusername%2Fupload&format%3Djson%26oauth_consumer_key%3D00000%26oauth_nonce%3D1313541553TcVIpWJ18WxEZeXO%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1313541553%26oauth_token%3D000000%26oauth_version%3D1.0%26title%3Dtitle%26type%3Dimage

私が言ったようにそれはうまく見え、私が試した他の方法のどれにも問題がないので、私は私のベースストリングに問題があるとは思いません。2つの理由から、curlがデータを送信する方法に問題があると思います。

1)削除リクエストを実行しようとしたときに最初にアルバムを削除する際に問題が発生し、同様のエラーが発生しましたが、追加されたパラメーターを使用してポストリクエストを実行しただけで_method=DELETEすべてが正常に機能しました

2)これは私が問題を抱えた唯一の方法であり、これまでのところ、送信されるデータがmultipart/form-dataとしてエンコードされる必要がある唯一の方法です。

これは、uploadfileパラメーターを割り当てる方法と関係があると思いましたが、ファイルについては、署名と、そのパラメーターをベース文字列から除外すると記載されているドキュメントだけについては文句を言いません。

誰か考えがありますか?今、私はいくつかのcurl_setoptが欠けていると思っています。

参照リンクの例に送信されたリクエストを比較しますが、Curlリクエストの本文を表示する方法がわかりません(ヘッダーを表示でき、multipart / form-dataと表示されます)

4

1 に答える 1

1

multipart/form-data の送信を生の URL でエンコードする必要がないことに気づきませんでした。パラメータのエンコードを停止するとすぐに、すべてが期待どおりに機能しました。

于 2011-08-24T23:55:12.077 に答える