Java Http客户端通过POST上传文件

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

相关文章

应用场景 C端用户提交工单、工单创建完成之后、会发布一条工...
线程类,设置有一个公共资源 package cn.org.chris.concurre...
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量