Java-使用ApacheHTTP客户端发布GZIP文件
我需要将一个tar.gzip文件从一个java应用程序(通过Servlet)发送到另一个java应用程序——我正在使用具有多个组件的HTTP客户端来实现这一点 在文件传输过程中,文件的大小似乎增加了一倍——就好像它正在被解压缩一样——并且它不再是tar.gz或tar文件 以下是发送方法:Java-使用ApacheHTTP客户端发布GZIP文件,java,servlets,httpclient,Java,Servlets,Httpclient,我需要将一个tar.gzip文件从一个java应用程序(通过Servlet)发送到另一个java应用程序——我正在使用具有多个组件的HTTP客户端来实现这一点 在文件传输过程中,文件的大小似乎增加了一倍——就好像它正在被解压缩一样——并且它不再是tar.gz或tar文件 以下是发送方法: HttpClient http = new DefaultHttpClient(); HttpPost post = new HttpPost(url); MultipartEntit
HttpClient http = new DefaultHttpClient();
HttpPost post = new HttpPost(url);
MultipartEntity multipart = new MultipartEntity();
ContentBody fileContent = new FileBody(file, "application/octet-stream");
ContentBody pathContent = new StringBody(file.getAbsolutePath());
multipart.addPart("package", fileContent);
multipart.addPart("path", pathContent);
post.setEntity(multipart);
HttpResponse response = null;
try {
response = http.execute(post);
StringWriter sw = new StringWriter();
IOUtils.copy(response.getEntity().getContent(), sw);
} catch (Exception ex){
log.error("Unable to POST to ["+url+"].",ex);
}
return result;
以下是上述代码发布到的servlet方法:
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.info("File transfer request received, collecting file information and saving to server.");
Part filePart = req.getPart("package");
Part filePathPart = req.getPart("path");
StringWriter sw = new StringWriter();
IOUtils.copy(filePathPart.getInputStream(), sw);
String path = sw.getBuffer().toString();
File outputFile = new File(path);
FileWriter out = new FileWriter(outputFile);
IOUtils.copy(filePart.getInputStream(), out);
log.info("File ["+path+"] has been saved to the server.");
out.close();
sw.close();
}
我不是这方面的专家——而且谷歌似乎也没有什么帮助。。。任何帮助都会很好
谢谢,
皮特我通过以下方式完成了这项工作:
发送代码:
HttpClient http = new DefaultHttpClient();
HttpPost post = new HttpPost(url);
post.addHeader("path", file.getAbsolutePath());
MultipartEntity multipart = new MultipartEntity();
ContentBody fileContent = new FileBody(file); //For tar.gz: "application/x-gzip"
multipart.addPart("package", fileContent);
post.setEntity(multipart);
接收代码:
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.info("File transfer request received, collecting file information and saving to server.");
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List fileItems = upload.parseRequest(req);
Iterator iterator = fileItems.iterator();
if (iterator.hasNext()){
FileItem fileItem = (FileItem) iterator.next();
File file = new File(req.getHeader("path"));
fileItem.write(file);
log.info("File ["+fileItem.getName()+"] has been saved to the server.");
}
} catch (Exception ex) {
log.error("Unable to retrieve or write file set...",ex);
}
}
造成您的具体问题的原因是您正在使用
FileWriter
而不是FileOutputStream
将传入字节转换为字符:
FileWriter out = new FileWriter(outputFile);
ZIP文件是二进制文件,由特定的字节序列表示,而不是文本、HTML、XML等字符文件。通过这种方式将字节转换为字符,只会使原始二进制内容格式错误,从而导致文件无法识别为ZIP文件。你最终会得到一个损坏的文件
如果改用FileOutputStream
,则问题将得到解决。完全没有必要用Commons FileUpload来取代这一切
另见:
与具体问题无关,出于安全原因,在服务器端重用特定于客户端的绝对路径不是一个好主意,但您迟早会发现这一点。而是在最高级别重用文件名,最好与
File 35; createTempFile()
结合使用,以自动生成唯一的文件名后缀