我正在关注this教程,其中解释了如何通过将图像声明为Blob
对象来将图像存储到数据存储区中。没问题,问题在于,在示例中,图像是以这种方式获取的:
public class StoreMovieServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
URLFetchService fetchService = URLFetchServiceFactory.getURLFetchService();
// Fetch the image at the location given by the url query string parameter
HTTPResponse fetchResponse = fetchService.fetch(new URL(req.getParameter("url")));
String fetchResponseContentType = null;
for (HTTPHeader header : fetchResponse.getHeaders()) {
// For each request header, check whether the name equals
// "Content-Type"; if so, store the value of this header
// in a member variable
if (header.getName().equalsIgnoreCase("content-type")) {
fetchResponseContentType = header.getValue();
break;
}
}
if (fetchResponseContentType != null) {
// Create a new Movie instance
Movie movie = new Movie();
movie.setTitle(req.getParameter("title"));
movie.setImageType(fetchResponseContentType);
// Set the movie's promotional image by passing in the bytes pulled
// from the image fetched via the URL Fetch service
movie.setImage(fetchResponse.getContent());
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
// Store the image in App Engine's datastore
pm.makePersistent(movie);
} finally {
pm.close();
}
}
}
}
我没有url
从哪里获取图片。
相反,我想将它们存储在Servlet
中的某个位置,然后从那里将它们存储到数据存储区中。
因此,我如何获取本地存储在Servlet中的一些图像,而不是从外部URL获取它们?
换句话说,我应该在哪里定位我想要投放的图像?
更新
根据@Nick的建议,我意识到有问题的教程并不能很好地解决我的需求。因此,我已经在
doPost
的{{1}}方法中重新进行了更改并完成了这样做:
Servlet
InputStream s = this.getClass().getClassLoader().getResourceAsStream("http://cardimgs.org/imgs/cardbackground1.jpg");
Movie movie = new Movie();
try {
byte[] bytes = IOUtils.toByteArray(s);
movie.setImage(bytes);
}catch (IOException e){
e.printStackTrace();
}
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
// Store the image in App Engine's datastore
pm.makePersistent(movie);
} finally {
pm.close();
}
课程:
link,
和我的Movie
:
link 1
我尝试定义静态文件。但问题是,使用上面的代码appengine-web.xml
似乎是InputStream
并返回null
。
以下是我将图像存储在Servlet中的方法:
如何成功访问我的静态文件?
更新2
我可以通过改变这个来加载图像:
NullPointerException
到此:
InputStream s = this.getClass().getClassLoader().getResourceAsStream("http://cardimgs.org/imgs/cardbackground1.jpg");
无需在InputStream s = getServletContext().getResourceAsStream("/WEB-INF/imgs/cardbackground1.jpg");
文件中添加具有属性<include>
的文件夹的路径。
答案 0 :(得分:1)
粗略地看一下这个教程并不是处理这类内容的好方法。它看起来是一个旧教程。
要在gae中存储图像,您应该使用imageservice。它将为您处理所有基础知识,并为您提供在网页上呈现内容的URL。它还可以处理动态调整大小和裁剪,以及通过谷歌基础设施提供服务。
要解决表面问题,要从Java项目加载文件,请使用类加载器。
this.class.getClassloader().getResourceAsStream("image/resource.jpg")
但是,您也可以直接在GAE上提供战争中的静态资源,这也将由谷歌的基础设施管理,是首选方法。 这是在appengine-web.xml文件中配置的。 根据您的描述,我认为这是您应该做的。