内容处置:自动下载文件

oymdgrw7  于 2022-09-28  发布在  其他
关注(0)|答案(1)|浏览(167)

对服务器的API调用返回了一个Content-Disposition格式的zip文件,我正在使用FileSaver的saveAs保存该文件。

this.ajax.raw(requestUrl, {
        dataType: 'binary',
        xhr: () => {
          const myXhr = $.ajaxSettings.xhr()
          myXhr.responseType = 'blob'
          return myXhr
        }
      }).then((response) => {
        this.downloadSuccess(response, minTimeString, maxTimeString, downloadCompletedMessage)
      }).catch((e) => {
        this.downloadError(e)
      })

downloadSuccess (response, minTime, maxTime, downloadCompletedMessage) {
    const filename = (response.jqXHR.getResponseHeader('Content-Disposition').split('"')[1])
    saveAs(response.payload, filename, 'application/zip')

这对于小文件很好,但如果文件大于2Gb,则会失败(文件下载成功,但保存的文件仅为1Kb)。
在我的研究过程中,我看到浏览器可以在没有FileSaver的情况下下载文件,如果响应有Content-Disposition,这在我的情况下是正确的。但我不知道该怎么做。
我需要以不同的方式使用请求吗?

jmo0nnb3

jmo0nnb31#

来自文档:
Content-Disposition附件头是从浏览器下载文件的最佳首选方式。它具有更好的跨浏览器兼容性,没有任何内存限制,并且不需要任何JavaScript。
下载文件不需要ajax request。仅确保服务器添加Content-Disposition标头并提供下载链接。
如果您还可以使用HTML5中的锚下载属性。
使浏览器将链接的URL视为下载。

const link = document.createElement('a');
link.href = '/xyz/abc.pdf';
link.download = "file.pdf";
link.dispatchEvent(new MouseEvent('click'));
<a href="/xyz/abc.pdf" download="file.pdf"></a>

相关问题