【问题标题】:Fetching a set of images in Servlet and send them to my Android app在 Servlet 中获取一组图像并将它们发送到我的 Android 应用程序
【发布时间】:2015-07-29 01:00:17
【问题描述】:

我正在关注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 所建议的,我意识到有问题的教程并不是满足我需求的好方法。因此,我在ServletdoPost 方法中重新更改了它并这样做了:

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

Movie 类: link,

还有我的appengine-web.xmllink 1

我尝试在其中定义我的静态文件。但是,问题在于,InputStream 上方的代码似乎是null 并返回NullPointerException。 以下是我在 Servlet 中存储图像的方式:

link 2

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

更新 2

我可以通过更改来加载图像:

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

到这里:

InputStream s = getServletContext().getResourceAsStream("/WEB-INF/imgs/cardbackground1.jpg");

无需在appengine-web.xml文件中添加属性为<include>的文件夹的路径。

【问题讨论】:

  • 没有存储在 servlet 中的东西。在 appengine 中没有意义,因为实例可以更改
  • 那么我应该在哪里放置我想要投放的图片?
  • datastore 或更合适的 gce
  • 当然可以,但是为了将图像存储在数据存储中,您需要从某个地方获取它们。问题是:从哪里来?
  • 您的意思是它们是您的应用引擎资源的一部分?如果是这样,他们有一个网址。当然,如果您已经将它们作为资源,我认为将它们存储在其他地方是没有意义的。这就是为什么我不明白 Q

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


【解决方案1】:

粗略浏览本教程并不是处理此类内容的好方法。它看起来是一个旧教程。

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

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

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

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

【讨论】:

  • 好的,谢谢...现在我可以访问图像,然后将它们存储到 Movie 对象中,您是否认为我也应该使它们持久化,然后将它们发送回应用程序,还是我应该直接将它们发送到应用程序?
  • 您可以将战争中不在 WEB-INF 文件夹中的任何内容作为网络资产提供。您无需将数据保存在数据存储中。这并不总是合适的(例如,如果您想索引所有 imdb,那将是一个不好的方法)。在您的情况下,只需将图像放入您的战争中,例如在 images/image-1.jpg 中,然后您可以使用myapp.appspot.com/images/image-1.jpg 提供它。如果您采用这种方法,这就是您需要保存在电影对象中的所有内容,即 URL,而不是完整的字节 []
  • 好的,但我不想在 Web 浏览器中显示图像,我想将它们发送到我的应用程序。那么如何将它们发送到我的 Android 应用程序?
  • 第一步 - 最初将其包含在您的 SO 问题中。第二步 - 将 URL 发送到您的 android 应用程序并让他们获取它。或者,正如您所做的那样,您可以保存它并发送字节流,但是网络非常擅长提供内容 - 内容类型、连接优化、缓存、边缘缓存、etag) - 你不会做任何事情。您的手卷解决方案可能不是最理想的。 Appengine 就是要依靠环境的优势,而不是围绕基础进行编程。
  • 我会说,如果图像总数小于 10mb,为了简单起见,请将其包含在您的战争中。如果超过 10mb,则使用文件上传 servlet 将它们保存到图像服务中,并提供这些 url。无论哪种方式,我都不会将图像数据作为 Json 中的 base64 编码数据发送到 android,除非它们是微小的缩略图。
猜你喜欢
  • 1970-01-01
  • 2012-01-07
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
相关资源
最近更新 更多