1

タイトルにあるように

入力がファイルの場合、oauthRequest.addBodyParameter(key、value)はあまりうまく機能しないようです

ファイルを文字列に強制するために次のことを試みましたが、役に立ちませんでした。

File f = new File("xyz.png");
InputStream is = new FileInputStream(f);
int intValue = -1;
String value = "";
do {
   intValue = is.read();
   if (intValue != -1) {
      char c = (char) intValue;
      value += c;
   }
} while (intValue != -1);

ちなみに、私はプログラムでFlickrに画像をアップロードしようとしています(もっと簡単な方法があるかどうかはわかりません)

4

3 に答える 3

4

もちろんaddBodyParameter、bodyパラメータを含めたくないので、機能しません。マルチパートhttpリクエストを作成したいのです。

Scribeはこれを簡単にしません。その理由は、Apiがファイルのアップロードをサポートすることはあまり一般的ではなく、他のライブラリがこれをうまく行うためです。(スクライブがapache commons httpを使用するように移行されると、すべての人にとって物事が簡単になります)

@Chrisが言うように(+1)、このaddPayloadメソッドを使用することは可能であり、推奨されていますが、マルチパートリクエストを自分で作成する必要があります。ごめん。

免責事項:私は図書館の著者です。

于 2011-12-13T18:50:14.140 に答える
3

ここで問題になっているのは、画像ファイルの読み取り方法だと思います。一度に1つずつ読み取った文字から構築された文字列として画像を表すと、問題が発生します。charはバイトですが、Javaの文字列はUTF-8です。文字列を出力すると、それを構築するために使用した文字を取得するだけでなく、UTF-8表現を取得します。

それで、これを自分で試したのではpublic void addPayload(byte[] payload)なく、代わりにこの方法を使ってみましたaddBodyParameter(key, value)か?それはすぐにそれをするように思えます。

于 2011-12-13T12:04:20.903 に答える
2

@Pabloの発言に加えて、すでにApache Commons HTTPクライアントライブラリを使用している場合は、MultipartEntityオブジェクトを使用してマルチパートリクエストのフォーマットを処理できます。

MultipartEntity reqEntity = new MultipartEntity();
// add your ContentBody fields as normal...

// Now, pull out the contents of everything you've added and set it as the payload
ByteArrayOutputStream bos = new ByteArrayOutputStream((int)reqEntity.getContentLength());
reqEntity.writeTo(bos);
oAuthReq.addPayload(bos.toByteArray());

// Finally, set the Content-type header (with the boundary marker):
Header contentType = reqEntity.getContentType();
oAuthReq.addHeader(contentType.getName(), contentType.getValue());

// Sign and send like normal:
service.signRequest(new Token(oAuthToken, oAuthSecret), oAuthReq);
Response oauthResp = oAuthReq.send();

もちろん、これには欠点があります。コンテンツ本体全体byte[]をメモリ内に読み込む必要があるため、巨大なファイルを送信する場合、これは最適ではない可能性があります。ただし、小さなアップロードの場合、これでうまくいきました。

于 2013-01-28T06:20:07.513 に答える