画像(ファイル)をGAE(Java)にアップロードして保存する最も簡単な方法を探しています。シンプルで明確な結果なしに何時間もグーグルで...:(
見つかった このリンク 。
しかし、私はまだ画像を保存する方法とそれを取得する方法を知りません...私は単純なサーブレットの例を探しています...
提供されたリンク "アプリへのファイルアップロードの処理方法" は、画像をアップロードする方法を説明しています。
イメージをホストするには、 Datastore service を使用して、他のデータとともにイメージを保存および提供する必要があります。
これがサンプルコードです。独自のエンティティ(ビジネス、ユーザーなど)に画像用のフィールドを持たせる方法については、スケッチとして意図されています。コードを簡素化するために、すべてのエラー処理と回復を無視しました。
画像でエンティティを宣言します。他のフィールドがあることを想像できます。タグ、場所など
@Entity
public class MyImage {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
@Persistent
private String name;
@Persistent
Blob image;
public MyImage() { }
public MyImage(String name, Blob image) {
this.name = name;
this.image = image;
}
// JPA getters and setters and empty contructor
// ...
public Blob getImage() { return image; }
public void setImage(Blob image) { this.image = image; }
}
次に、画像の受け入れを開始したら(通常のファイルアップロードの失敗に加えて、同じ名前の画像が既にアップロードされている場合には注意してください)。 ServletFileUpload
およびIOUtils
は、Apache Commonsライブラリの一部であるクラスです。
// Your upload handle would look like
public void doPost(HttpServletRequest req, HttpServletResponse res) {
// Get the image representation
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator iter = upload.getItemIterator(req);
FileItemStream imageItem = iter.next();
InputStream imgStream = imageItem.openStream();
// construct our entity objects
Blob imageBlob = new Blob(IOUtils.toByteArray(imgStream));
MyImage myImage = new MyImage(imageItem.getName(), imageBlob);
// persist image
PersistenceManager pm = PMF.get().getPersistenceManager();
pm.makePersistent(myImage);
pm.close();
// respond to query
res.setContentType("text/plain");
res.getOutputStream().write("OK!".getBytes());
}
最後に、名前を指定して画像を提供したい場合:
Blob imageFor(String name, HttpServletResponse res) {
// find desired image
PersistenceManager pm = PMF.get().getPersistenceManager();
Query query = pm.newQuery("select from MyImage " +
"where name = nameParam " +
"parameters String nameParam");
List<MyImage> results = (List<MyImage>)query.execute(name);
Blob image = results.iterator().next().getImage();
// serve the first image
res.setContentType("image/jpeg");
res.getOutputStream().write(image.getBytes());
}
blobstore API を使用します。
Blobstore APIを使用すると、アプリケーションは、blobsと呼ばれるデータオブジェクトを提供できます。このデータオブジェクトは、データストアサービスのオブジェクトに許可されるサイズよりもはるかに大きくなります。 Blobは、ビデオファイルや画像ファイルなどの大きなファイルを提供したり、ユーザーが大きなデータファイルをアップロードしたりするのに役立ちます。 BLOBは、HTTPリクエストを介してファイルをアップロードすることにより作成されます。通常、アプリケーションは、ファイルアップロードフィールドを持つフォームをユーザーに提示することでこれを行います。フォームが送信されると、Blobstoreはファイルのコンテンツからblobを作成し、blob keyと呼ばれる不透明な参照をblobに返します。後でBLOBを提供するために使用します。アプリケーションは、ユーザーのリクエストに応じて完全なblob値を提供するか、ストリーミングファイルのようなインターフェイスを使用して値を直接読み取ることができます...
URLを提供するGoogle App Engine Blob Storeを使用する最も簡単な方法(インスタンス時間を節約します)
import com.google.appengine.api.files.FileService;
import com.google.appengine.api.files.AppEngineFile;
import com.google.appengine.api.files.FileWriteChannel;
import com.google.appengine.api.blobstore.BlobKey;
import com.google.appengine.api.images.ImagesServiceFactory;
import com.google.appengine.api.images.ServingUrlOptions;
...
// your data in byte[] format
byte[] data = image.getData();
/**
* MIME Type for
* JPG use "image/jpeg" for PNG use "image/png"
* PDF use "application/pdf"
* see more: https://en.wikipedia.org/wiki/Internet_media_type
*/
String mimeType = "image/jpeg";
// save data to Google App Engine Blobstore
FileService fileService = FileServiceFactory.getFileService();
AppEngineFile file = fileService.createNewBlobFile(mimeType);
FileWriteChannel writeChannel = fileService.openWriteChannel(file, true);
writeChannel.write(Java.nio.ByteBuffer.wrap(data));
writeChannel.closeFinally();
// your blobKey to your data in Google App Engine BlobStore
BlobKey blobKey = fileService.getBlobKey(file);
// THANKS TO BLOBKEY YOU CAN GET FOR EXAMPLE SERVING URL FOR IMAGES
// Get the image serving URL (in https:// format)
String imageUrl =
ImagesServiceFactory.getImagesService().getServingUrl(
ServingUrlOptions.Builder.withBlobKey(blobKey
).secureUrl(true));