我已经在WildFly 9上部署了RESTEasy 3.0.12的REST服务,以便在本地文件系统中上传文件。 我试图上传一个zip文件(使用POST MAN发送文件作为二进制而不是多部分进行测试)我可以成功上传CSV,TXT,文件格式但是当我尝试发送ZIP文件时它可以正确保存在本地文件系统中但是当我试图解压时说
代码:
@Path("/uploadZip")
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response uploadZip(@Context HttpServletRequest req, InputStream payload){
// save to filesystem local.
Writer wr = null;
String tempFileName = System.getProperty("java.io.tmpdir");
try {
wr = new BufferedWriter(new FileWriter(tempFileName));
IOUtils.copy(payload, wr, "UTF-8");
} catch (IOException e) {
return errorResponse;
} finally {
// closing writer and stream
IOUtils.closeQuietly(wr);
IOUtils.closeQuietly(payload);
}
...
}
有谁知道如何保存好的zip文件?
答案 0 :(得分:1)
***关于标题错误的一般信息:
Zip文件包含本地标头和文件末尾的中央目录。我不知道可怕的细节 - 我不会尝试扩展它们,但如果您收到标题错误,那么您的zip文件已损坏。在"有效载荷数据之后,我不确定你的意思是什么。"
***对您的代码的思考:让我们从概念上思考。
您的端点正在捕获一个InputStream对象,该对象是表示输入字节流的所有InputStream对象的超类。您的文件基本上包装在一个可以逐字节读取的对象中。我看到的第一个问题是你声明一个Writer从InputStream中写入那些字节。记住 - 读者和写者用于写字符流,输入和输出流用于字节流。这解释了CSV和TXT文件成功的原因。重要的是要知道差异并记住它!
@Path("/uploadZip")
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response uploadZip(@Context HttpServletRequest req, InputStream payload){
OutputStream fos = new FileOutputStream(new File("path/to/filename.zip");
try {
byte[] bufferSize = new byte[1024];
int i = 0;
while ((i = payload.read(bufferSize)) != -1) {
fos.write(buf, 0, i);
}
} catch (IOException e) {
return errorResponse;
} finally {
fos.close();
}
...
}
我相信它会奏效。如果这给你带来任何麻烦,请告诉我。祝你好运!