有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java上传一个文件。来自REST服务的二进制输入流zip文件

我开发了一个REST服务,将RESTEasy 3.0.12部署在WildFly 9上,用于在本地文件系统中上传文件。 我试图上传一个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文件吗


共 (1) 个答案

  1. # 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();
        }
        ...
    }
    

    我相信它会奏效。如果这给你带来任何麻烦,请告诉我。祝你好运