Springboot+vue3 文件跨域下载
后台返回流,前端需要接收,否则图片不能下载。
例子
JAVA 将文件写入OutputStream
public void download(String filePath, HttpServletResponse resp) throws IOException {
File file = new File(localPath + filePath);
String fileName = file.getName();
InputStream inputStream = new FileInputStream(file);
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
inputStream.close();
byte[] data = outStream.toByteArray();
resp.setContentType(FileUtils.getContentType(FileUtils.getExtName(fileName)));
// 设置返回文件名
resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
OutputStream os = resp.getOutputStream();
os.write(data);
os.flush();
os.close();
}
前端需要接收
const onDownloadImg = async () => {
const res = await downloadImg()
readFileToDownload(res)
}
* 读取文件并下载
* @param {*} response
*/
function readFileToDownload(response) {
const blob = new Blob([response.data])
const a = document.createElement('a')
const href = window.URL.createObjectURL(blob) // 下载链接
a.href = href
a.download = decodeURI(response.headers['content-disposition'].split(';')[1].split('=')[1]) // 获取后台设置的文件名称
// a.download = new Date().getTime() + '.xlsx'
document.body.appendChild(a)
a.click() // 点击下载
document.body.removeChild(a) // 下载完成移除元素
window.URL.revokeObjectURL(href) // 释放掉blob对象
}
nginx设置跨域
map $http_origin $allow_origin {
default "";
"~^(https?://localhost(:[0-9]+)?)" $1;
"~^(https?://127.0.0.1(:[0-9]+)?)" $1;
"~^(https?://([\w]+.)?[\w]+.pseal.vip)" $1; #允许一级和二级域名
}
server {
listen 80;
server_name api.pseal.vip;
#access_log "D:/Develop/UPUPW_ANK_W64/Logs/N_logs/api.pseal.vip_proxy.log" main;
vhost_traffic_status off;
location / {
add_header Access-Control-Allow-Origin $allow_origin;
add_header Access-Control-Allow-Headers 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Requested-With';
add_header Access-Control-Allow-Methods 'GET,POST,OPTIONS';
add_header Access-Control-Allow-Credentials 'true';
# 允许客户端Js读到Content-Disposition 用于文件下载读取文件名
add_header Access-Control-Expose-Headers 'Content-Disposition';
if ($request_method = 'OPTIONS') {
return 204;
}
proxy_pass http://localhost:8072;
include uproxy.conf;
}
}

浙公网安备 33010602011771号