0

I have a problem with my created zip file. I am using Java 8. I tried to create a zip file out of a byte array, which contains two or more Excel files. . So, I thought everything is alright. I do an ajax call for create and download my file but i don't have the popup for download my zip and i don't have error.

This is my 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")
        } 
    });
} 

This is my Controller:

@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");
    }
}

Problem:

  • The Browser not should open a download box
  • The response isn't handled in the error or in the success (ajax)

So what do I wrong or what is the proper way to do this?

In my navigator you can see the response with my file but download box not should open enter image description here

Jean Mermoz
  • 31
  • 1
  • 3

1 Answers1

0

You need to do two things:

  1. Set headers before writing anything to response stream.
  2. Remove output.close(); you should not do that. Stream is opened and closed by container.

Second point actually not affecting your problem, its just an advice. You can read more about it here Should one call .close() on HttpServletResponse.getOutputStream()/.getWriter()?.

Community
  • 1
  • 1
chimmi
  • 2,054
  • 16
  • 30