代码之家  ›  专栏  ›  技术社区  ›  OXMO456

如何使用google app engine(java)上传和存储图像

  •  69
  • OXMO456  · 技术社区  · 16 年前

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

    this link .

    我正在寻找简单的servlet示例。

    3 回复  |  直到 6 年前
        1
  •  96
  •   Mario Kutlev Domi    13 年前

    您提供的链接 "How do I handle file uploads to my app?" 说明如何上载图像。

    要承载图像,您需要使用 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

    // 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());
    }
    
        2
  •  10
  •   gnat Nat Poor    9 年前

    blobstore API

    BlobstoreAPI允许应用程序为数据对象提供服务,称为 斑点 斑点键 ,以后您可以使用它来提供blob。应用程序可以响应用户请求提供完整的blob值,也可以使用流文件(如接口)直接读取该值。。。

        3
  •  5
  •   Dodo    13 年前

    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));