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

2022-08-31 14:22:33

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

找到此链接

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


答案 1

您提供的链接“如何处理文件上传到我的应用?”说明了如何上传图像。

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

下面是一个示例代码。它意味着作为草图,用于如何拥有自己的实体(即业务,用户等)具有图像字段。我忽略了所有错误处理和恢复以简化代码。

使用映像声明实体。您可以想象有其他字段,例如标签,位置等

@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; }
}

然后,当您开始接受图像时(请注意除了典型的文件上传失败之外,还已经上传了具有相同名称的图像的情况)。 并且是Apache Commons库的一部分的类。ServletFileUploadIOUtils

// 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

使用 blobstore API

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


推荐