如何使用 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,客户端发送的请求在语法上不正确