我正在开发一个J2ME客户端,必须使用HTTP将文件上传到Servlet.
使用Apache Commons FileUpload覆盖了servlet部分
- protected void doPost(HttpServletRequest request,HttpServletResponse response)
- {
- ServletFileUpload upload = new ServletFileUpload();
- upload.setSizeMax(1000000);
- File fileItems = upload.parseRequest(request);
- // Process the uploaded items
- Iterator iter = fileItems.iterator();
- while (iter.hasNext()) {
- FileItem item = (FileItem) iter.next();
- File file = new File("\files\\"+item.getName());
- item.write(file);
- }
- }
Commons Upload似乎只能上传multipart文件,但是没有应用程序/ octect-stream.
但是对于客户端,没有Multipart类,在这种情况下,也不可能使用任何HttpClient库.
其他选项可能是使用HTTP Chunk上传,但是我没有找到一个明确的例子来说明如何实现这一点,特别是在servlet方面.
我的选择是:
– 实现一个用于http chunk上传的servlet
– 实现用于http多部分创建的原始客户端
我不知道如何执行上述任何选项.
任何建议?
解决方法
通过HTTP发送文件应该是使用multipart / form-data编码进行的.您的servlet部分很好,因为它已经使用
Apache Commons FileUpload来解析多部分/表单数据请求.
然而,您的客户端部分显然不正确,因为您似乎将文件内容原始的写入请求主体.您需要确保您的客户端发送正确的多部分/表单数据请求.如何做到这一点取决于您用来发送HTTP请求的API.如果它是纯朴的java.net.URLConnection,那么你可以在this answer底部找到一个具体的例子.如果你使用Apache HttpComponents Client这个例子,
- HttpClient client = new DefaultHttpClient();
- HttpPost post = new HttpPost(url);
- MultipartEntity entity = new MultipartEntity();
- entity.addPart("file",new FileBody(file));
- post.setEntity(entity);
- HttpResponse response = client.execute(post);
- // ...
- File file = new File("\files\\"+item.getName());
- item.write(file);
这可能会覆盖任何以前上传的同名文件.我建议使用File#createTempFile()
替代.
- String name = FilenameUtils.getBaseName(item.getName());
- String ext = FilenameUtils.getExtension(item.getName());
- File file = File.createTempFile(name + "_","." + ext,new File("/files"));
- item.write(file);