我正在开发一个必须使用 HTTP 将文件上传到 Servlet 的 J2ME 客户端。
servlet 部分使用 Apache Commons FileUpload 进行了介绍
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 类,在这种情况下,也不能使用任何 HttpClient 库。
其他选项可能是使用 HTTP 块上传,但我还没有找到一个明确的例子来说明如何实现这一点,特别是在 servlet 端。
我的选择是: - 为 http 块上传实现一个 servlet - 为 http 多部分创建实现一个原始客户端
我不知道如何实现上述选项。有什么建议吗?
通过 HTTP 发送文件应该使用
multipart/form-data
编码进行。您的 servlet 部分很好,因为它已经使用Apache Commons FileUpload来解析multipart/form-data
请求。但是,您的客户端部分显然不好,因为您似乎正在将文件内容原始写入请求正文。您需要确保您的客户发送正确的
multipart/form-data
请求。具体如何执行取决于您用于发送 HTTP 请求的 API。如果它是普通的香草java.net.URLConnection
,那么你可以在这个答案的底部附近找到一个具体的例子。如果您为此使用Apache HttpComponents 客户端,那么这里有一个具体示例,摘自他们的文档:String url = "https://example.com"; File file = new File("/example.ext"); try (CloseableHttpClient client = HttpClients.createDefault()) { HttpPost post = new HttpPost(url); HttpEntity entity = MultipartEntityBuilder.create().addPart("file", new FileBody(file)).build(); post.setEntity(entity); try (CloseableHttpResponse 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);