如何使用谷歌应用引擎 (java) 上传和存储图像
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1513603/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to upload and store an image with google app engine (java)
提问by OXMO456
I am looking for the simplest way to upload and store an image (file) to the GAE (java). Googling for hours without any simple and clear result.
我正在寻找将图像(文件)上传和存储到 GAE (java) 的最简单方法。谷歌搜索数小时没有任何简单明了的结果。
Found this link.
找到了这个链接。
But I still don't know how to store an image, and how to retrieve it. I am looking for simple servlet example.
但我仍然不知道如何存储图像,以及如何检索它。我正在寻找简单的 servlet 示例。
采纳答案by notnoop
The link your provided "How do I handle file uploads to my app?"explains how you can upload the image.
您提供的链接“如何处理文件上传到我的应用程序?” 解释了如何上传图像。
To host the images, you need to use the Datastore serviceto store and serve image along with your other data.
要托管图像,您需要使用数据存储服务来存储和提供图像以及其他数据。
Here is a sample code. It is meant as a sketch, for how you can have your own entity (i.g. business, user, etc) have a field for an image. I ignored all error handling and recovery to simplify the code.
这是一个示例代码。它是一个草图,用于说明如何让自己的实体(ig 业务、用户等)拥有一个图像字段。我忽略了所有错误处理和恢复以简化代码。
Declaring your entity with the image. You can imagine having other fields, e.g. tags, location, etc
使用图像声明您的实体。您可以想象有其他字段,例如标签、位置等
@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; }
}
Then when you start accepting images (watch out for cases where an image with the same name has already been uploaded in addition to the typical file upload failures). ServletFileUpload
and IOUtils
are classes that are part of the Apache Commons library.
然后当您开始接受图像时(除了典型的文件上传失败之外,还要注意已经上传了同名图像的情况)。 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());
}
And finally when you want to serve an image given its name:
最后,当你想提供一个给定名称的图像时:
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());
}
回答by Claude Vedovini
Use the blobstore API:
The Blobstore API allows your application to serve data objects, called blobs, that are much larger than the size allowed for objects in the Datastore service. Blobs are useful for serving large files, such as video or image files, and for allowing users to upload large data files. Blobs are created by uploading a file through an HTTP request. Typically, your applications will do this by presenting a form with a file upload field to the user. When the form is submitted, the Blobstore creates a blob from the file's contents and returns an opaque reference to the blob, called a blob key, which you can later use to serve the blob. The application can serve the complete blob value in response to a user request, or it can read the value directly using a streaming file-like interface...
Blobstore API 允许您的应用程序提供数据对象,称为blob,其大小远大于 Datastore 服务中对象允许的大小。Blob 可用于提供大文件(例如视频或图像文件)以及允许用户上传大数据文件。Blob 是通过 HTTP 请求上传文件来创建的。通常,您的应用程序将通过向用户呈现一个带有文件上传字段的表单来完成此操作。提交表单后,Blobstore 会根据文件的内容创建一个 blob,并返回对该 blob 的不透明引用,称为blob key,稍后您可以使用它来提供 blob。应用程序可以响应用户请求提供完整的 blob 值,或者它可以使用类似流文件的接口直接读取值...
回答by Dodo
Easiest way to use Google App Engine Blob Store serving URL (you save instance time)
使用 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));