2

I'm trying to let user download a file from server. I use ServletOutputStream in my controller (here is the code)

@RequestMapping(value = "/get-backup-file", method = RequestMethod.GET)
@ResponseBody
public void getBackupFile(
    HttpServletRequest request, 
    HttpServletResponse response) throws MalformedURLException, IOException {

    File backupFile = new File("PATH_TO_FILE");        

    ServletOutputStream out = response.getOutputStream();

    response.setContentType("application/octet-stream");
    response.setContentLength((int)backupFile.length());
    response.setHeader("Content-Disposition", "attachment; filename=\"" + "database backup" + "\"");

    FileInputStream in = new FileInputStream(backupFile);
    byte[] buffer = new byte[4096];

    int length;
    while( (length = in.read(buffer) ) > 0) {
        out.write(buffer, 0, length);
    }
    in.close();
    out.flush();        
} 

My client side looks like this:

      $.ajax({
        url: 'URL_TOCONTROLLER_METHOD',
        contentType: "application/octet-stream; charset=utf-8",
        type: 'GET',
        success: function(data) {
            console.log(data);
        },
        error: function(data) {   
            console.log("error");
        }
    });

when I console.log the data it has the content of the file, but I want this file to be downloaded tu the user, not just printed. how can make let user to save the data as file?

user2944769
  • 51
  • 2
  • 2
  • 7
  • http://stackoverflow.com/questions/6722716/how-to-download-file-from-server-using-jquery-ajax-and-spring-mvc-3 – hgoebl Nov 04 '13 at 10:19

3 Answers3

3

You have to send path where the file stored and open its on success function,then user can download it

if success is like that

{"status":"success","path":"temp\/Vehicle_Units_2013_11_04.xls"}

script is

success: function(msg)
                  {
                      if(msg.status=="session-expired")
                      {
                      window.location.replace("index.jsp");
                      }
                      if(msg.status=="success")
                      {
                          window.open(msg.path);
                      }

                  }
Sridhar R
  • 20,190
  • 6
  • 38
  • 35
  • do you mean the path to file? I don't have the url to that file. I'm not understanding this ServletOutputStream staff, what does that do? should I somehow get url of the ServletOutputStream? My main problem is that I don't know how to generate url to that file – user2944769 Nov 04 '13 at 10:54
  • in your server folder path wil be the url.if you dont hav url means how the user will download the file from server? – Sridhar R Nov 04 '13 at 10:57
  • then how user will download? – Sridhar R Nov 04 '13 at 11:05
  • the file is in server machine but not in the server folder. it's in server's local resource. – user2944769 Nov 04 '13 at 11:11
  • give the path on success thats all:-) we need path to download or else not – Sridhar R Nov 04 '13 at 11:12
-1

You cannot force a file download with Ajax. Javascript cannot save files to the user's computer for a number of security reasons. The solution is to make a controller which serves the download page and have your success function change the window.location to it.

success : function (data) {
    window.location = data;
}

assuming data is just the URL. You can make this more robust to use JSON or any other response format from which you can retrieve the link.

Sotirios Delimanolis
  • 274,122
  • 60
  • 696
  • 724
-1

Don't use ajax. Instead provide a download link.

<a href="URL_TOCONTROLLER_METHOD" download>Click To Download</a>
AJcodez
  • 31,780
  • 20
  • 84
  • 118