Java では、(ファイル タイプの) イメージを base64 にエンコードする方法を教えてください。この画像を Android アプリから Imgur にアップロードしようとしています。ありがとう!
1 に答える
サービスへの接続に Apache HTTP クライアントを使用している場合は、. 画像の送信には MultiPartEntity を使用することをお勧めします。正確な理由はわかりませんが、Base64 を試したところ、画像が巨大な場合に問題が発生しました (OOM 例外)。
Apache HTTP クライアントを使用して画像を送信するには。MultiPartEntity を作成し、addPart を使用して画像を追加するだけです。
public class UploadImagePayload extends MultiPartEntity {
public UploadImagePayload(ProgressListener listener, String imageFileUrl) {
super(HttpMultipartMode.STRICT, listener);
this.addPart("image", new FileBody(new File(imageFileUrl)));
this.setStringPart("type", "file");
}
public void setAlbumId(String albumId) {
this.setStringPart("album_id", albumId);
}
public void setName(String name) {
this.setStringPart("name", name);
}
public void setTitle(String title) {
this.setStringPart("title", title);
}
public void setDescription(String description) {
this.setStringPart("description", description);
}
private void setStringPart(String name, String value) {
try {
addPart(name, new StringBody(value));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
Log.e(TAG, "unable to set string property on image upload");
}
}
}
次に、上記のクラスのインスタンスを作成し、それにデータを設定します。
myEntity.addPart("image", new FileBody(new File(imageFileUrl)));
myEntity.setStringPart("type", "file");
リクエストを送信するには、HTTPPost を作成し、ペイロードをエンティティに設定します。
HttpPost post = new HttpPost(requestUrl);
post.setEntity(myEntity);
HttpClient client = new DefaultHttpClient();
client.execute(post);
上記を使用するのは非常に簡単で、MultiPartEntiy を拡張してロジックを追加するだけで、リッスンする進行状況を簡単に追加できます。次に例を示します。
public class BigMultiPartEntity extends MultipartEntity {
private ProgressListener listener;
public BigMultiPartEntity(final HttpMultipartMode mode, final ProgressListener listener)
{
super(mode);
this.listener = listener;
}
public BigMultiPartEntity(HttpMultipartMode mode, final String boundary, final Charset charset, final ProgressListener listener)
{
super(mode, boundary, charset);
this.listener = listener;
}
@Override
public void writeTo(final OutputStream outstream) throws IOException
{
super.writeTo(new CountingOutputStream(outstream, this.listener));
}
public interface ProgressListener {
void transferred(int num);
}
public class CountingOutputStream extends FilterOutputStream
{
private ProgressListener listener;
private int transfered;
/**
* Creates an output stream filter built on top of the specified
* underlying output stream.
*
* @param out the underlying output stream to be assigned to
* the field <tt>this.out</tt> for later use, or
* <code>null</code> if this instance is to be
* created without an underlying stream.
*/
public CountingOutputStream(OutputStream out, ProgressListener listener) {
super(out);
this.listener = listener;
this.transfered = 0;
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
this.transfered += len;
//Log.d(TAG, "writing...transfer @ "+transfered);
this.listener.transferred((int) ((transfered / (float) getContentLength()) * 100));
out.write(b, off, len);
}
@Override
public void write(int b) throws IOException {
this.transfered += b;
//Log.d(TAG, "writing...transfer @ "+transfered);
this.listener.transferred((int) ((transfered / (float) getContentLength()) * 100));
out.write(b);
}
}
}
Apache HTTPClient を使用しておらず、確かに Base64 を使用したい場合は 、画像を Base64 文字列に変換する方法をご覧ください。
さらにヘルプが必要な場合は、@ https://bitbucket.org/eggman87/ezimgur-open/srcにある私の Android imgur アプリのソース コードを確認してください。imgur と対話するためのロジックは、API プロジェクトにあります。