【问题标题】:Retrieve an Image from a POST request从 POST 请求中检索图像
【发布时间】:2012-07-12 03:11:50
【问题描述】:

我正在尝试将图片发送到我的 java servlet(托管在亚马逊 ec2 上),以便稍后将其传输到亚马逊 s3,并想知道如何从发布请求中检索图片。

上传代码

请求通过 iOS RestKit API 像这样发送(pic.imageData 是 NSData 类型):

RKParams* params = [RKParams params];

[params setValue:pic.dateTaken forParam:@"dateTaken"];
[params setValue:pic.dateUploaded forParam:@"dateUploaded"];

[params setData:pic.imageData MIMEType:@"image/jpeg" forParam:@"image"];

[RKClient sharedClient].username = deviceID;
[RKClient sharedClient].password = sessionKey;

[RKClient sharedClient].authenticationType = RKRequestAuthenticationTypeHTTPBasic;

uploadPictureRequest = [[RKClient sharedClient] post:kUploadPictureServlet params:params delegate:self];

解析代码存根

这就是我在 Java servlet 上解析其他 2 个参数的方式:

double dateTaken = Double.parseDouble(req.getParameter("dateTaken"));
double dateUploaded = Double.parseDouble(req.getParameter("dateUploaded"));

问题

问题是:如何在我的服务器上检索和解析图像?

【问题讨论】:

  • 我的建议可能有点离题,但您也可以选择 base64 编码图像。虽然效率不高,但他们为我服务得很好。 davidbcalhoun.com/2011/…
  • 您使用的是哪个 servlet 容器?
  • @AnupamSaini 我对服务器编程非常陌生,所以简单地使用 restkit 似乎是最简单的解决方案。
  • @RameshPVK apache tomcat 我相信
  • @RameshPVK 我的 ec2 上的实例映像显示:AMI: ElasticBeanstalk-Tomcat6-64bit-201202071737 (ami-d5ec3cbc)

标签: java servlets


【解决方案1】:

Servlet 3.0 支持读取多部分数据。 Servlet 3.0 中的 MutlipartConfig 支持如果使用 @MutlipartConfig 注释对servelt 进行注释,则容器负责通过以下方式使 Multipart 部分可用

HttpServletRequest.getParts()
HttpServletRequest.getPart("name");

参考资料:

【讨论】:

  • 看来我不能使用这种方法,因为我正在运行 tomcat 6 并且根据这个站点:tomcat.apache.org/whichversion.html我只有 2.x servets
  • 那你应该使用commons apache文件上传
  • @Lion:这也是只适用于最近的容器的方式 :) 不是每个人都那么幸运,而 lib 方式相对容易并且向后和向前兼容。如果你有一个支持 Servlet 3+ 的容器,那我肯定会去的。
【解决方案2】:

类似这样的东西,使用Apache Commons FileUpload

 // or @SuppressWarnings("unchecked")
 @SuppressWarnings("rawtypes")
 public void doPost(HttpServletRequest request, HttpServletResponse response) 
         throws ServletException, IOException {
     if (ServletFileUpload.isMultipartContent(request)) {
         final FileItemFactory   factory = new DiskFileItemFactory();
         final ServletFileUpload upload  = new ServletFileUpload(factory);

         try {
             final List items = upload.parseRequest(request);

             for (Iterator itr = items.iterator(); itr.hasNext();) {
                 final FileItem item = (FileItem) itr.next();

                 if (!item.isFormField()) {
                    /*
                     * TODO: (for you)
                     *  1. Verify that file item is an image type.
                     *  2. And do whatever you want with it.
                     */
                 }
             }
         } catch (FileUploadException e) {
             e.printStackTrace();
         }
     }
 }

请参阅FileItem API 参考文档以确定下一步做什么。

【讨论】:

  • 感谢您的回复,apache commons fileupload 说明了以下内容:如果使用 POST 方法提交 HTTP 请求,并且内容类型为“multipart/form-data”,则 FileUpload可以解析该请求,并以调用者易于使用的方式提供结果。我的请求符合这个吗?
  • @LuisOscar:试试吧,你会找到答案的。
  • @LuisOscar:您的请求确实是POST。根据我从RestKitRKParams reference documentation 收集到的信息,它应该是一个多部分的消息。
  • 谢谢,我正在尝试将 commons fileupload 安装到 java,以便我可以测试它,稍后会回复您。
  • 好的,我设法导入了公共资源,但我收到以下警告:列表是原始类型。对泛型类型 List 的引用应该被参数化。迭代器是原始类型。对泛型类型 Iterator 的引用应该被参数化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 2017-12-03
  • 2020-01-09
  • 1970-01-01
相关资源
最近更新 更多