69

画像 (ファイル) を GAE (Java) にアップロードして保存する最も簡単な方法を探しています。シンプルで明確な結果なしで何時間もグーグル。

このリンクを見つけました。

しかし、画像を保存する方法と取得する方法はまだわかりません。簡単なサーブレットの例を探しています。

4

3 に答える 3

96

あなたが提供したリンク「アプリへのファイルのアップロードを処理するにはどうすればよいですか?」画像をアップロードする方法を説明します。

画像をホストするには、Datastore サービスを使用して、他のデータと一緒に画像を保存および提供する必要があります。

これがサンプルコードです。これは、独自のエンティティ (ig ビジネス、ユーザーなど) に画像のフィールドを持たせる方法のスケッチとして意図されています。コードを簡素化するために、すべてのエラー処理と回復を無視しました。

画像を使用してエンティティを宣言します。タグ、場所など、他のフィールドがあることを想像できます

@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およびIOUtilsApache 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());
}
于 2009-10-03T17:17:45.740 に答える
10

ブロブストア APIを使用します。

Blobstore API を使用すると、アプリケーションはblobと呼ばれるデータ オブジェクトを提供できます。このデータ オブジェクトは、Datastore サービスでオブジェクトに許可されているサイズよりもはるかに大きくなります。BLOB は、ビデオや画像ファイルなどの大きなファイルを提供する場合や、ユーザーが大きなデータ ファイルをアップロードできるようにする場合に便利です。BLOB は、HTTP 要求を介してファイルをアップロードすることによって作成されます。通常、アプリケーションは、ファイル アップロード フィールドを含むフォームをユーザーに提示することでこれを行います。フォームが送信されると、ブロブストアはファイルのコンテンツからブロブを作成し、ブロブ キーと呼ばれるブロブへの不透明な参照を返します。これを後でブロブを提供するために使用できます。アプリケーションは、ユーザーの要求に応じて完全な blob 値を提供するか、ストリーミング ファイルのようなインターフェイスを使用して値を直接読み取ることができます...

于 2010-06-29T07:07:20.370 に答える
5

Google App Engine Blob Store サービス URL を使用する最も簡単な方法 (インスタンス時間を節約できます)

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));
于 2013-04-28T09:38:11.640 に答える