GAE/J+Slim3でPicasaへ画像アップロード
大いにハマったのでメモ。
ライブラリの取得
Java用のライブラリは以下から取得可能。
- Client Libraries - Google Data Protocol
- guava-libraries - Guava: Google Core Libraries for Java 1.5+
- Installing required libraries: Using Eclipse with Google Data APIs - Google Data Protocol
ただし、Guavaライブラリの最新版11.0.1は、ローカル環境では問題ないものの、本番環境では以下の例外が発生してしまいちっとも上手くいかない。10.0.1を使用したところ、ちゃんと動きました…。
java.lang.NoSuchMethodError:
com.google.common.collect.ImmutableSet.of([Ljava/lang/Object;)Lcom/google/common/collect/ImmutableSet;
java.lang.NoClassDefFoundError:
Could not initialize class com.google.gdata.client.photos.PicasawebService
プロジェクトの作成
Slim3プロジェクトを作成。war/WEB-INF/lib 配下にJARファイルを配置し、CLASSPATH に追加。使用したJARファイルは以下のとおり。
- activation.jar
- mail.jar
- gdata-client-1.0.jar
- gdata-client-meta-1.0.jar
- gdata-core-1.0.jar
- gdata-media-1.0.jar
- gdata-photos-2.0.jar
- gdata-photos-meta-2.0.jar
- guava-10.0.1.jar
投稿先Picasaアルバムの設定
Picasa Webにてアルバムを作成。画像アップロードには、ユーザーID/パスワードとアルバムIDが必要となります。アルバムIDについては、以下の記事中『Picasa WebのユーザIDとアルバムIDを調べる』を参考に。
サンプルソース
Slim3のコントローラーから使用するユーティリティなんかを想定。フォームよりアップロードされたFileItemをそのまま渡してます。
package root.util; import java.net.URL; import org.slim3.controller.upload.FileItem; import com.google.gdata.client.photos.PicasawebService; import com.google.gdata.data.PlainTextConstruct; import com.google.gdata.data.media.MediaByteArraySource; import com.google.gdata.data.photos.PhotoEntry; public class PicasaUtil { private static final String USERID = "user@gmail.com"; private static final String PASSWORD = "password"; private static final String ALBUMID = "5705211000000000000"; public static String upload(FileItem file) throws Exception { PicasawebService service = new PicasawebService("applicationName"); service.setUserCredentials(USERID, PASSWORD); URL url = new URL("https://picasaweb.google.com/data/feed/api/user/" + USERID + "/albumid/" + ALBUMID); PhotoEntry photo = new PhotoEntry(); photo.setTitle(new PlainTextConstruct(file.getFileName())); photo.setDescription(new PlainTextConstruct(file.getFileName())); photo.setClient("clientName"); MediaByteArraySource media = new MediaByteArraySource(file.getData(), file.getContentType()); photo.setMediaSource(media); PhotoEntry entry = service.insert(url, photo); String uploadUrl = entry.getMediaContents().get(0).getUrl(); return uploadUrl; } }
最終的にアップロードした画像のURLが返却されます。あとはDataStoreに突っ込むなり、JSPに渡すなりご自由に。