Cla*_* Ku 15 java servlets file-upload http java-me
我正在开发一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
Commons Upload似乎只能上传多部分文件,但没有application/octect-stream.
但是对于客户端,没有Multipart类,在这种情况下,也不可能使用任何HttpClient库.
其他选项可能是使用HTTP Chunk上传,但我还没有找到一个明确的例子,说明如何实现它,特别是在servlet端.
我的选择是: - 为http块上传实现一个servlet - 为http多部分创建实现一个原始客户端
我不知道如何实现上述选项.有什么建议吗?
Bal*_*usC 28
通过HTTP发送文件应该使用multipart/form-data编码进行.您的servlet部分很好,因为它已经使用Apache Commons FileUpload来解析multipart/form-data请求.
但是,您的客户端部分显然不是很好,因为您似乎正在将文件内容原始写入请求正文.您需要确保您的客户端发送正确的multipart/form-data请求.具体操作方法取决于您用于发送HTTP请求的API.如果它是普通的香草java.net.URLConnection,那么你可以在这个答案的底部附近找到一个具体的例子.如果您正在使用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);
// ...
Run Code Online (Sandbox Code Playgroud)
与具体问题无关,您的服务器端代码中存在一个错误:
File file = new File("\files\\"+item.getName());
item.write(file);
Run Code Online (Sandbox Code Playgroud)
这可能会覆盖任何以前上传的具有相同名称的文件.我建议改用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);
Run Code Online (Sandbox Code Playgroud)
Hem*_*ant 12
以下代码可用于使用HTTP Client 4.x上传文件(以上答案使用现已弃用的MultipartEntity)
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
String uploadFile(String url, File file) throws IOException
{
HttpPost post = new HttpPost(url);
post.setHeader("Accept", "application/json");
_addAuthHeader(post);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
// fileParamName should be replaced with parameter name your REST API expect.
builder.addPart("fileParamName", new FileBody(file));
//builder.addPart("optionalParam", new StringBody("true", ContentType.create("text/plain", Consts.ASCII)));
post.setEntity(builder.build());
HttpResponse response = getClient().execute(post);;
int httpStatus = response.getStatusLine().getStatusCode();
String responseMsg = EntityUtils.toString(response.getEntity(), "UTF-8");
// If the returned HTTP response code is not in 200 series then
// throw the error
if (httpStatus < 200 || httpStatus > 300) {
throw new IOException("HTTP " + httpStatus + " - Error during upload of file: " + responseMsg);
}
return responseMsg;
}
Run Code Online (Sandbox Code Playgroud)
您将需要以下Apache库的最新版本:httpclient,httpcore,httpmime.
getClient()可以替换为HttpClients.createDefault().
Ale*_*exR -2
无需输入具体细节,您的代码看起来就很好。
现在您需要服务器端。我建议您使用 Jakarta FileUpload,这样您就不必执行任何操作。只需部署和配置即可。