GAE/J+Slim3でPicasaへ画像アップロード

大いにハマったのでメモ。

ライブラリの取得

Java用のライブラリは以下から取得可能。


ただし、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に渡すなりご自由に。