为什么servlet不在多部分请求中找到FileItem?

我编写了一个使用Apache commons文件上传库处理文件上传的Servlet。 以下是一些代码:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (isMultipart) { try { DiskFileItemFactory fileItemFactory = new DiskFileItemFactory(); // Set size threshold for storing upload fileItemFactory.setSizeThreshold(1 * 1024 * 50); // 50 KB // Set temporary directory to store uploaded files above threshold size fileItemFactory.setRepository(new File(TEMP_DIRECTORY)); ServletFileUpload upload = new ServletFileUpload(fileItemFactory); //HashMap params = new HashMap(); FileItemIterator iterator = upload.getItemIterator(request); upload.setSizeMax(REQUEST_MAX_SIZE); List items = upload.parseRequest(request); Iterator it = items.iterator(); while (it.hasNext()) { FileItem item = (FileItem) it.next(); if(item.isFormField()) { } else { String contentType = item.getContentType(); String fileName = item.getName(); String fieldName = item.getFieldName(); boolean isInMemory = item.isInMemory(); long sizeInBytes = item.getSize(); File uploadedFile = new File(PATH + "new_audio1.amr"); item.write(uploadedFile); System.out.println("Field: " + fieldName); System.out.println("File name: " + fileName); System.out.println("Size: " + sizeInBytes); System.out.println("Is in memory:" + isInMemory); } } } catch (Exception ex) { throw new ServletException(ex); } } else { throw new ServletException(); } 

由于某种原因让我感到厌烦,List’items’是空的,所以我无法获取上传的文件。

对于上传本身,我写了一些java代码:

 File audioFile = new File("C:\\Users\\Soto\\Desktop\\test recording.amr"); String url = "http://localhost:8080/AudioFileUpload/UploadServlet"; String charset = "UTF-8"; // random values String latitude = "145"; String longitude = "132"; String speed = "0"; String query; try { query = String.format("latitude=%s&longitude=%s&speed=%s", URLEncoder.encode(latitude, charset), URLEncoder.encode(longitude, charset), URLEncoder.encode(speed, charset)); } catch (UnsupportedEncodingException e) { query = String.format("latitude=%s&longitude=%s&speed=%s", latitude, longitude, speed); } HttpClient httpClient = new DefaultHttpClient(); httpClient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); HttpPost httpPost = new HttpPost(url + "?" + query); MultipartEntity mpEntity = new MultipartEntity(); ContentBody cbFile = new FileBody(audioFile, "audio/AMR"); mpEntity.addPart("audioFile", cbFile); httpPost.setEntity(mpEntity); HttpResponse response = null; try { response = httpClient.execute(httpPost); HttpEntity responseEntity = response.getEntity(); System.out.println(response.getStatusLine()); if(responseEntity != null) System.out.println(EntityUtils.toString(responseEntity)); if(responseEntity != null) { EntityUtils.consume(responseEntity); } httpClient.getConnectionManager().shutdown(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

我觉得这个文件正在被正确附加和上传。 我还尝试通过HTML和multipart / form-data post请求来完成它,但是仍然找不到该文件。

我究竟做错了什么?

编辑:我删除了doPost()开头的行以及if语句:

 ServletFileUpload.isMultipartContent(request); 

然后上传工作正常。 这种方法是否可能消耗请求的’输入/输出/无论是什么’流?

谢谢

编辑:我删除了doPost()开头的行以及if语句:

 ServletFileUpload.isMultipartContent(request); 

然后上传工作正常。 这种方法是否可能消耗请求的’输入/输出/无论是什么’流?

这很奇怪。 所有方法都检查请求方法是否等于POST以及Content-Type标头是否以multipart/开头。 以下是当前最新Commons FileUpload API版本源代码的摘录(多年来没有太大变化):

 public static final boolean isMultipartContent( HttpServletRequest request) { if (!"post".equals(request.getMethod().toLowerCase())) { return false; } String contentType = request.getContentType(); if (contentType == null) { return false; } if (contentType.toLowerCase().startsWith(MULTIPART)) { return true; } return false; } 

你看,没有什么令人震惊的。

也许你正在使用一个非常模糊/错误的servlet容器,它表示在调用request.getMethod()getContentType()时隐式消耗请求体的错误。

我想你忘了设置内容类型? 使用提琴手看看电线上的什么

为什么不使用MultiPartPostData

http://hc.apache.org/httpclient-3.x/apidocs/org/apache/commons/httpclient/methods/MultipartPostMethod.html