在Servlet中获取一组图像并将它们发送到我的Android应用程序

时间:2015-05-17 14:10:10

标签: image google-app-engine http url servlets

我正在关注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

和我的Movielink 1

我尝试定义静态文件。但问题是,使用上面的代码appengine-web.xml似乎是InputStream并返回null。 以下是我将图像存储在Servlet中的方法:

link 2

如何成功访问我的静态文件?

  

更新2

     

我可以通过改变这个来加载图像:

NullPointerException

到此:

InputStream s = this.getClass().getClassLoader().getResourceAsStream("http://cardimgs.org/imgs/cardbackground1.jpg");

无需在InputStream s = getServletContext().getResourceAsStream("/WEB-INF/imgs/cardbackground1.jpg"); 文件中添加具有属性<include>的文件夹的路径。

1 个答案:

答案 0 :(得分:1)

粗略地看一下这个教程并不是处理这类内容的好方法。它看起来是一个旧教程。

要在gae中存储图像,您应该使用imageservice。它将为您处理所有基础知识,并为您提供在网页上呈现内容的URL。它还可以处理动态调整大小和裁剪,以及通过谷歌基础设施提供服务。

要解决表面问题,要从Java项目加载文件,请使用类加载器。

this.class.getClassloader().getResourceAsStream("image/resource.jpg")

但是,您也可以直接在GAE上提供战争中的静态资源,这也将由谷歌的基础设施管理,是首选方法。 这是在appengine-web.xml文件中配置的。 根据您的描述,我认为这是您应该做的。