为什么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
- 如何确保我的HttpClient 4.1不会泄漏套接字?
- HttpClient为Kerberos身份validation设置凭据
- HttpClient支持多种TLS协议
- 使用HttpProxy通过preemtive身份validation连接到主机
- java.lang.NoSuchMethodError:org.apache.http.protocol.BasicHttpContext:方法()V未找到
- 如何使用DefaultHttpClient写入OutputStream?
- HttpClient ThreadSafeClientConnManager抛出“连接重置”
- 使用HttpClient4在上传文件中设置标题“Content-Type”时出现问题
- 通过HttpClient接受所有Cookie