使用AJAX GET从Spring Service下载文件

4

我正在尝试实现一个服务,它可以自动启动请求文件的下载。

这是我的AJAX调用:

function downloadFile(fileName) {
  $.ajax({
    url : SERVICE_URI + "files/" + fileName,
    contentType : 'application/json',
    type : 'GET',
    success : function (data)
    {
      alert("done!");
    },
    error: function (error) {
      console.log(error);
    }
  });
}

这是我的Spring Service方法GET:

@RequestMapping(value = "/files/{file_name}", method = RequestMethod.GET)
public void getFile(@PathVariable("file_name") String fileName,
                    HttpServletResponse response) {
    try {
        // get your file as InputStream
        FileInputStream fis = new FileInputStream( fileName + ".csv" );
        InputStream is = fis;
        // copy it to response's OutputStream
        ByteStreams.copy(is, response.getOutputStream());
        response.setContentType("text/csv");
        response.flushBuffer();
    } catch (IOException ex) {
        throw new RuntimeException("IOError writing file to output stream");
    }

}

当我的客户端从服务器请求现有文件时,执行 AJAX success() 方法但文件甚至没有下载。我做错了什么吗?

1个回答

7
不要使用ajax,只需将window.location.href设置为文件的url,并在您的服务器脚本中设置http内容配置头来强制浏览器保存文件。
function downloadFile(fileName) {
  window.location.href = SERVICE_URI + "files/" + fileName;
}

你说的这些头文件是哪些? - charliebrownie
完美运行! 以防有人想知道我如何在服务器中设置http头:response.setContentType("application/x-download");response.setHeader("Content-disposition", "attachment; filename=" + fileName); - charliebrownie
@Musa 如果我的服务器在头部验证JWT令牌,那该怎么办?有没有办法在window.location.href中添加头部?如何处理这个问题? - das
如果您需要设置头信息,则必须使用ajax。 - Musa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接