【问题标题】:Java download file via httpResponse spring boot通过 httpResponse spring boot 下载 Java 文件
【发布时间】:2019-08-19 08:07:13
【问题描述】:

我想从网站的服务器上下载一个 pdf 文件。 当我按下一个按钮时,我会向 Spring Boot 服务器发送一个 ajax 请求。我创建了 httpservletresponse 的输出流并将文件字节写入其中。 在javascript中,我得到了pdf文件信息,但我不知道如何下载它们。 我认为问题在于 jquery 中的调用。 我不确定我是否使用了正确的内容类型。

这是我的请求的请求和响应标头:

Request-Headers
    Accept: application/json, text/javascript, */*; q=0.01
    Accept-Encoding: gzip, deflate, br
    Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7
    Connection: keep-alive
    Content-Type: application/pdf
    Host: localhost:8080
    Referer: http://localhost:8080/arbeitsvorratsliste
    Sec-Fetch-Mode: cors
    Sec-Fetch-Site: same-origin
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3880.4 Safari/537.36
    X-Requested-With: XMLHttpRequest
Response-Headers
Cache-Control: no-cache
Content-Disposition: attachment; filename=44005001.25759.pdf
Content-Encoding: UTF-8
Content-Type: application/pdf;charset=ISO-8859-1
Date: Mon, 19 Aug 2019 07:38:36 GMT
Expires: 0
Transfer-Encoding: chunked
@GetMapping("/print.do")
public void doPrint()
{
    final HttpServletResponse response = getResponse();
    RequestUtils.setResponseHeaders(response, "44005001.25759.pdf");

    Path path = Paths.get(settings.getPrintPath() + "\\44005001.25759.pdf");
    try
    {
        ServletOutputStream out = response.getOutputStream();
        InputStream in = new ByteArrayInputStream(Files.readAllBytes(path));

        byte[] outputByte = new byte[4096];
        // copy binary contect to output stream
        while (in.read(outputByte, 0, 4096) != -1)
        {
            out.write(outputByte, 0, 4096);
        }
        in.close();
        out.flush();
        out.close();
    }
    catch (IOException e)
    {
        LOG.error("WorkListController.doPrint(): Error while read from file.", e);
    }
    finally
    {
    }
}
jquery:
myProject.sendRequest('print.do', 'GET', null, null, null, null, null, "application/pdf");
myProject.sendRequest = function (url, method, dataGetter, onSuccess, onError, onDone, cache, contentType, noAuth, _form) {
var params = {
        url: url,
        type: method,
        data: getData(),
        dataType: 'json',
        contentType: 'application/json;charset=utf-8'
    };

    if (contentType)
        params.contentType = contentType;

    jQuery.ajax(params).always(function (xhrOrData, status, xhrOrException) {
        var xhr = (xhrOrData && typeof xhrOrData.status === 'number' && xhrOrData.status >= 0) ? xhrOrData : xhrOrException;
        if (xhr && typeof xhr.status === 'number' && xhr.status >= 0) {
            var json = volante.removeJsonPrefix(xhr.responseText);
            try {
                json = JSON.parse(json);
            } catch (e) {
                // error: json is undefined
            }
            checkResponse(xhr.status, json);
        } else {
            execError('Es trat ein interner Fehler auf.');
        }
    }).done(execDone);
}


【问题讨论】:

  • 这个out.write(outputByte, 0, 4096); 不正确。您应该使用从 read 返回的值,而不是 4096
  • 我已经更改了它们,但我有同样的问题,无法下载响应数据:int readLines; byte[] outputByte = new byte[4096]; // copy binary contect to output stream while ((readLines = in.read(outputByte, 0, 4096)) != -1) { out.write(outputByte, 0, readLines); }
  • 一旦通过 ajax 请求获得文件,就无法从 javascript 中保存文件。将获取文件的方式更改为简单请求,例如location.href='print.do?...' 或带有目标新窗口的锚点 (<a>)。

标签: java jquery spring-boot http download


【解决方案1】:

我发现了问题,如果你想下载一个文件你必须添加注解@PostMapping 和@ResponseBody。 在 javascript 中我没有调用 ajax 请求,但我调用了表单提交。

【讨论】:

    猜你喜欢
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多