通过ajax + spring-web下载文件

时间:2016-02-11 11:40:28

标签: java ajax spring scala spring-web

我有一些xml文件存储为我的数据库中的字符串和scala + spring后端与此控制器:

@RequestMapping(value = Array("/download"), method = Array(RequestMethod.GET))
def downloadFile(@RequestParam filename: String, //some more params
                 response: HttpServletResponse) = {
  val fileContent = // some logic here, returns file content as String
  response.setContentType("application/xml")
  response.setHeader("Content-Disposition", s"attachment;filename=$filename")
  response.setStatus(HttpServletResponse.SC_OK)
  response.getOutputStream.write(fileContent.getBytes)
  response.flushBuffer()
}

我也有这个脚本:

$.ajax({
     type: "GET",
     url: url,
     data: {
         filename: filename //and some more params
     }
})

然后我向服务器发送HTTP请求,获得正确的HTTP响应,然后没有任何反应。我从浏览器日志获得的所有信息都是响应在正文和标题中有文件内容,但下载永远不会启动。

我做错了什么?

我看到了这些SO Q& A但他们根本没有帮助我:

  

download file using an ajax request

     

Downloading a file from spring controllers

UPD1: 还尝试了this one,没有结果。

1 个答案:

答案 0 :(得分:0)

这就是我从服务器下载文件的方式。

    output = (byte[]) processedDocumentObject;
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    responseHeaders.setContentDispositionFormData("attachment", "file.xml");
    HttpEntity<byte[]> fileEntity = new HttpEntity<byte[]>(output,responseHeaders);
    return fileEntity;

然而,这是在java和HttpHeaders是org.springframework.http.HttpHeaders而HttpEntity是org.springframework.http.HttpEntity<byte[]>

此外,您最初需要将字符串转换为字节数组。