Ajax 请求无法下载文件问题

问题描述

Springboot 中前端发送请求至 Hadoop 下载文件,前后端均无报错,文件无法下载,浏览器无响应。代码如下:

<a th:data-id="${image.uploadTitle}" href="#"
   th:onclick="javascript:downloadInfo(this.getAttribute('data-id'))">下载&nbsp;
</a>
function downloadInfo(uploadTitle) {
    var params = {
        "uploadTitle": uploadTitle
    };
    var param = {params: JSON.stringify(params)};
    $.post('/downloadImage', param, function (data) {
        if (data.result === "0000") {
            alert("下载成功!");
        } else {
            alert("下载失败!");
        }
    });
}

本来以为是输入输出流的问题,定位日志排查,并无相关的错误日志,单步调试显示输入流与输出流均有数据,文件定位的路径也存在,来回折腾的脑壳疼,最后怀疑是文件下载的问题,模拟本地文件输入流下载也无响应,说明可能与 Hadoop 与文件无关;随即定位到文件下载的基本代码,偶然发现博客 () 中介绍前端不能以 ajax 发送请求,因为 ajax 返回的格式是字符的格式,浏览器没有任何反应。前端改成如下的方式访问:

function downloadInfo(uploadTitle) {
    window.location.href = "/downloadImage?uploadTitle=" + uploadTitle;
}

链接直接跳转可以正常下载文件。前端不能使用 Ajax 发送请求,而是直接链接跳转至后端!!!

那么问题来了,为什么前端采用 ajax 发送请求无法下载文件呢?Google 一下。

原因总结如下:
1. 主要是出于安全因素等方面的考虑,javascript 禁止在用户计算机上执行较底层的任务(包括启动文件下载提示、调用到浏览器的下载处理机制和程序等),所以无法保存文件到本地。
2. Ajax 请求本质上只是个“字符型”的请求,字符型指的是请求的内容是以文本类型存放。而文件的下载是以二进制形式进行的,无法处理;
3. Ajax 目前只接收 json, text, html, xml 格式的返回值,可能早些版本对于返回二进制的格式会抛出异常,但目前前后端均无任何提示。

参考链接

https://stackoverflow.com/questions/4545311/download-a-file-by-jquery-ajax
https://blog.csdn.net/qq_37469931/article/details/86630955
https://blog.csdn.net/define_LIN/article/details/88854261

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值