如何使用 MultipartEntity 在 servlet 中获取实体?

Posted

技术标签:

【中文标题】如何使用 MultipartEntity 在 servlet 中获取实体?【英文标题】:How to get Entity at the servlet using MultipartEntity? 【发布时间】:2012-05-24 22:07:17 【问题描述】:

如果我像这样将文件上传到我的 servlet:

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.tumblr.com/api/write");

try 

    MultipartEntity entity = new MultipartEntity();
    entity.addPart("type", new StringBody("photo"));
    entity.addPart("data", new FileBody(image));
    httppost.setEntity(entity);
    HttpResponse response = httpclient.execute(httppost);
 
catch (ClientProtocolException e)  
catch (IOException e) 

如何在 servlet 中检索内容?

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws  IOException 

     request.???

我使用 Google App Server 作为我的 Servlet API

【问题讨论】:

只需搜索 *** - 涉及文件上传 + servlet 的数百个问题/答案已经存在! 阅读vikaskanani.wordpress.com/2011/01/11/… @home 第一步是搜索网络和这个站点,你应该假设这里询问的人已经这样做了。我认为让我自己去搜索不是这个网站的精神。所以至少你应该发布任何链接而不是评论去搜索。 【参考方案1】:

如果您的 Servlet 容器或服务器或引擎的版本 (如 2.5 或更早版本),您可能希望利用第三方库 Apache Commons FileUpload。尽管该文件暗示了对上传文件的使用,但它也有效地处理了从 POST 方法上传的已发布数据,就像它解释的 here 一样。

Servlet API,从 3.0 版开始提供一些调用来处理发布的数据,这些数据是在 POST-Request 中发送的。唯一的要求是您的实体内容的 MIME-Type 编码为“multipart/form-data”。

然后您可以使用以下任一方式检索内容的每个“部分”:

    getPart(String partName):其中“partName”是您的多内容实体的一部分的名称。

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws  IOException 
    
        String partName = "type"; // or "data"
        Part part = request.getPart(partName);
    
        // read your StringBody type
        BufferedReader reader = new BufferedReader( new InputStreamReader(part.getInputStream()));
        String line ="";
    
        while((line=reader.readLine())!=null)
        
            // do Something with a line
            System.out.println(line);
    
        
    
        // or with a binary Data
        partName="data";
        part = request.getPart(partName);
    
        // read your FileBody data
        InputStream is = part.getInputStream();
        // do Something with you byte data
    
        is.read();
        // is.read(b);
        // ..
    
    
    

    getParts():

它实现了与 getPart(partName) 相同的结果,而这里的给定数据是已发送数据的所有部分的集合。要检索该集合的每个部分,只需对集合使用线程安全迭代:

Iterator<Part> iterator = request.getParts().iterator();
       Part parts = null;
       while (iterator.hasNext()) 
       parts = (Part) iterator.next();
          //rest of the code block removed
       
    

因为 getPart()/getParts() 仅从 Servlet 3.0 版本开始工作,您将确保使用支持的 Servlet 容器和/或升级您当前的 Servlet 容器。一些支持 3.0 的 Server 或 Servlet 容器:

    tomcat 7.0: Jboss Web Resin

【讨论】:

我正在使用 Google App Engine,所以我不知道是否可以使用 Servlet 3.0 或如何使用,但我会尝试查找有关它的详细信息。谢谢。 GAE Servlet API 版本是 2.5,所以我想我将无法使用它。不过谢谢。 @Rami:我根据您的问题编辑了我的答案。如果你再读一遍,你会发现一个链接,可以快速演示到处理你的情况的第三方库“Apache Commons FileUpload”。享受!

以上是关于如何使用 MultipartEntity 在 servlet 中获取实体?的主要内容,如果未能解决你的问题,请参考以下文章

如何在MultipartEntity中传递long或int数据类型值?

The type MultipartEntity is deprecated

Android 错误:MultipartEntity,客户端发送的请求在语法上不正确

MultipartEntity 类型已弃用

Android - MultipartEntity 和依赖项

java 使用MultipartEntity Builder进行图像上传