我正在开发一个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);