从 REST 服务上传一个 .zip 文件作为二进制 InputStream
Uploading a .zip file as binary InputStream from REST service
我在 WildFly 9 上部署了 RESTEasy 3.0.12 开发了一个 REST 服务来上传本地文件系统中的文件。
我试图上传一个 zip 文件(使用 POST MAN 以二进制方式发送文件而不是 multi-part 进行测试)我可以成功上传 CSV、TXT 文件格式,但是当我尝试发送 ZIP 文件时它保存正确在本地文件系统中,但是当我尝试解压缩时它说
- Headers错误
- 归档开始未确认
- 警告:headers错误
- payload数据结束后还有一些数据
代码:
@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 文件?
***关于您的 Headers 错误的一般信息:
Zip 文件包含本地 headers 和文件末尾的中央目录。我不知道这些令人毛骨悚然的细节——我也不会尝试详细说明它们,但是如果您收到 headers 错误,那么您的 zip 文件已损坏。我不确定 "payload data."
之后有一些数据是什么意思
***对代码的思考:让我们从概念上思考。
您的端点正在捕获一个 InputStream object,它是所有表示字节输入流的 InputStream object 的超类。您的文件基本上包装在一个 object 中,您可以从 byte-for-byte 中读取它。我看到的第一个问题是您声明了一个 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();
}
...
}
我相信它会奏效。如果这给您带来任何麻烦,请告诉我。祝你好运!
我在 WildFly 9 上部署了 RESTEasy 3.0.12 开发了一个 REST 服务来上传本地文件系统中的文件。 我试图上传一个 zip 文件(使用 POST MAN 以二进制方式发送文件而不是 multi-part 进行测试)我可以成功上传 CSV、TXT 文件格式,但是当我尝试发送 ZIP 文件时它保存正确在本地文件系统中,但是当我尝试解压缩时它说
- Headers错误
- 归档开始未确认
- 警告:headers错误
- payload数据结束后还有一些数据
代码:
@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 文件?
***关于您的 Headers 错误的一般信息:
Zip 文件包含本地 headers 和文件末尾的中央目录。我不知道这些令人毛骨悚然的细节——我也不会尝试详细说明它们,但是如果您收到 headers 错误,那么您的 zip 文件已损坏。我不确定 "payload data."
之后有一些数据是什么意思***对代码的思考:让我们从概念上思考。
您的端点正在捕获一个 InputStream object,它是所有表示字节输入流的 InputStream object 的超类。您的文件基本上包装在一个 object 中,您可以从 byte-for-byte 中读取它。我看到的第一个问题是您声明了一个 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();
}
...
}
我相信它会奏效。如果这给您带来任何麻烦,请告诉我。祝你好运!