在byte []中创建内存中的zip文件。 Zip文件永远不建议下载

时间:2016-09-09 07:39:14

标签: javascript java ajax zip

我的创建的zip文件有问题。我正在使用Java 8.我尝试用字节数组创建一个zip文件,其中包含两个或更多Excel文件。 。所以,我认为一切都很好。我进行了ajax调用以创建和下载我的文件,但我没有弹出下载我的zip文件,我没有错误。

这是我的javascript:

function getFile() {
    $.ajax({
        type: "POST",
        url: "/support-web/downloadCSV",
        dataType: "json",
        contentType: 'application/json;charset=UTF-8',
        data: jsonfile,
        success: function (data) {
            console.log("in sucess");
            window.location.href="/support-web/downloadCSV/"+data
        },
        error:function (xhr, ajaxOptions, thrownError){
            console.log("in error")
        } 
    });
} 

这是我的控制器:

@Controller
@RequestMapping(value = "/downloadCSV")
public class DownloadCSVController {
    private static final int BUFFER_SIZE = 4096;

    @RequestMapping(method = RequestMethod.POST)
    @ResponseBody
    public void downloadCSV(HttpServletRequest request, HttpServletResponse response, @RequestBody String json)
            throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try (ZipOutputStream zos = new ZipOutputStream(baos)) {
            int i = 0;
            for (String url : parts) {
                i++;
                URL uri = new URL(url);
                HttpURLConnection httpConn = (HttpURLConnection) uri.openConnection();
                int responseCode = httpConn.getResponseCode();

                if (responseCode == HttpURLConnection.HTTP_OK) {
                    String fileName = "";
                    String disposition = httpConn.getHeaderField("Content-Disposition");
                    String contentType = httpConn.getContentType();
                    int contentLength = httpConn.getContentLength();

                    if (disposition != null) {
                        // extracts file name from header field
                        int index = disposition.indexOf("filename=");
                        if (index > 0) {
                            fileName = disposition.substring(index + 9, disposition.length());
                        }
                    } else {
                        // extracts file name from URL
                        fileName = url.substring(url.lastIndexOf("/") + 1, url.length());
                    }

                    System.out.println("Content-Type = " + contentType);
                    System.out.println("Content-Disposition = " + disposition);
                    System.out.println("Content-Length = " + contentLength);
                    System.out.println("fileName = " + fileName);

                    // opens input stream from the HTTP connection
                    InputStream inputStream = httpConn.getInputStream();
                    ZipEntry entry = new ZipEntry(fileName + i + ".csv");
                    int length = 1;
                    zos.putNextEntry(entry);
                    byte[] b = new byte[BUFFER_SIZE];

                    while ((length = inputStream.read(b)) > 0) {
                        zos.write(b, 0, length);
                    }
                    zos.closeEntry();
                    inputStream.close();

                    System.out.println("File downloaded");
                }
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
        // this is the zip file as byte[]
                int size = baos.toByteArray().length;
    byte[] reportContent = baos.toByteArray();

    // Write file to response.
    OutputStream output = response.getOutputStream();
    output.write(reportContent);
    output.close();

    response.setContentType("application/force-download");
    response.setContentLength((int)size);
    response.setHeader("Content-Transfer-Encoding", "binary");
    response.setHeader("Content-Disposition","attachment; filename=\"test.zip\"");//fileName)       

        System.out.println("FIN TELECHARGEMENT");
    }
}

问题:

  • 浏览器不应该打开下载框
  • 错误或成功(ajax)
  • 中未处理响应

那么我错了什么或者做到这一点的正确方法是什么?

在我的导航器中,您可以看到我的文件的响应,但不应打开下载框 enter image description here

1 个答案:

答案 0 :(得分:0)

你需要做两件事:

  1. 在将任何内容写入响应流之前设置标题。
  2. 删除output.close();您不应该这样做。流由容器打开和关闭。
  3. 第二点实际上并没有影响你的问题,它只是一个建议。您可以在Should one call .close() on HttpServletResponse.getOutputStream()/.getWriter()?了解更多相关信息。