如何使用谷歌应用引擎上传和存储图像(java)

OXM*_*456 69 java google-app-engine image-uploading

我正在寻找上传和存储图像(文件)到GAE(java)的最简单方法.谷歌搜索几个小时没有任何简单明了的结果... :(

找到这个链接.

但我仍然不知道如何存储图像,以及如何检索它...我正在寻找简单的servlet exmample ...

not*_*oop 96

您提供的链接"我如何处理文件上传到我的应用程序?" 解释了如何上传图像.

要托管图像,您需要使用数据存储区服务来存储和提供图像以及其他数据.

这是一个示例代码.它是一个草图,表示如何让自己的实体(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; }
}
Run Code Online (Sandbox Code Playgroud)

然后,当您开始接受图像时(注意除了典型的文件上载失败之外,已经上传了具有相同名称的图像的情况). 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());
}
Run Code Online (Sandbox Code Playgroud)

最后,当你想要提供一个给出名字的图像时:

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());
}
Run Code Online (Sandbox Code Playgroud)


Cla*_*ini 10

使用blobstore API:

Blobstore API允许您的应用程序提供称为blob的数据对象,这些对象远大于Datastore服务中对象所允许的大小.Blob对于提供大型文件(如视频或图像文件)以及允许用户上载大型数据文件非常有用.通过HTTP请求上载文件来创建Blob.通常,您的应用程序将通过向用户显示带有文件上载字段的表单来完成此操作.提交表单时,Blobstore会根据文件的内容创建一个blob,并返回对blob的不透明引用,称为blob键,稍后您可以使用它来提供blob.应用程序可以响应用户请求提供完整的blob值,或者它可以使用类似流文件的接口直接读取值...

  • 这需要在您的应用程序中启用计费. (3认同)

小智 5

使用Google App Engine Blob商店服务网址的最简单方法(节省实例时间)

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));
Run Code Online (Sandbox Code Playgroud)