2

I have some problems to handle an excel file download with Ajax. I Have found this source code on an another webpage I copied that in my webproject:

$.ajax({
          type: "POST",
          url: "myStrutsAction.action",
          data: {p1:p1, p2:p2},                      
          success:  function(response, status, xhr){                                     
                          disableMyLoadingUserPopupScreen();                                                              

                            var filename = "";
                            var disposition = xhr.getResponseHeader('Content-Disposition');                             
                            if (disposition && disposition.indexOf('attachment') !== -1) {                                  
                                var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
                                var matches = filenameRegex.exec(disposition);
                                if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
                               disposition);                                    
                            }

                            var type = xhr.getResponseHeader('Content-Type');                              
                            var blob = new Blob([response], { type: type });

                            if (typeof window.navigator.msSaveBlob !== 'undefined') {
                                 window.navigator.msSaveBlob(blob, filename);
                            } else {
                                var URL = window.URL || window.webkitURL;
                                var downloadUrl = URL.createObjectURL(blob);                                   

                                if (filename) {                            
                                    var a = document.createElement("a");                                        
                                    if (typeof a.download === 'undefined') {
                                        window.location = downloadUrl;

                                    } else {
                                        a.href = downloadUrl;
                                        a.download = filename;
                                        document.body.appendChild(a);
                                        a.click();
                                    }
                                } else {
                                    window.location = downloadUrl;                                      
                                }

                                setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 100); 
                            }
                        }   
                    });     

This kind of code shows the user dialog for saving or opening the specific excelfile. But if I have tried to open the Excelfile, the File are damaged and couldn´t be opened (I have viewed in Notepad++ editor, but here I see some cryptical characters):

Here is my Struts2 execute method on the server:

public String execute(){

   // Create Excel File
   returnFileAsStream("myExcelfile");

   return null;
}

In this method I have written the HTTP Response Header:

private void returnFileAsStream(final String filename) throws IOException {
    final InputStream is = new FileInputStream(filename);
    OutputStream os = null;
    try {
        response.setContentType("application/octet-stream");            
        response.setHeader("Cache-Control", "maxage=3600");
        response.setHeader("Pragma", "public");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");             
        os = response.getOutputStream();

        int length;
        byte buf[] = new byte[1024];
        while ((length = is.read(buf)) > 0) {
            os.write(buf, 0, length);
        }           
        is.close();
        os.close();         
    } finally {
        // other code, not important                        
    }       
}

It is correct, that it is not possible to handle a file download with Ajax? I´m of the opinion, that it is the problem, that I want to handle some steps with binary data instead of text data and Ajax couldn´t be handle some steps with binary code?

1 Answers1

0

Set the content-type to :

For BIFF .xls files

application/vnd.ms-excel

For Excel2007 and above .xlsx files

application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

Clement Martino
  • 463
  • 3
  • 17