前言:这篇文件下载的后台代码太繁琐,建议参考https://www.cnblogs.com/zwh0910/p/13745947.html

前端:

 <el-button
type="primary"
icon="el-icon-download"
@click="downloadTemplate('药品清单-模板.xlsx')">下载模板</el-button>

在main.js中:

import fileDownload from 'js-file-download'

Vue.prototype.downloadTemplate = function (templateName) {
const fileEntity = {
fileName: templateName,
filePath: "D:\\prism\\svn\\drug-question\\drugques-pc\\src\\template\\"+templateName,
downloadChannel: 'DIR'
}
medicineListApi.ptsFileDownload(fileEntity).then(response => {
fileDownload(response.data, templateName)
}).catch(error => {
console.log(error)
})
}

在package.json中添加依赖版本

"dependencies": {
"@aximario/json-tree": "^2.1.0",
"axios": "^0.19.0",
"core-js": "^2.6.5",
"echarts": "^4.2.1",
"element-ui": "^2.13.2",
"js-file-download": "^0.4.4",
},

如果是下载本地的文件,则应写详细的路径:D:\prism\svn\drug-question\drugques-pc\src\template

在medicineList.js中

const baseUrl = "/medicineList"
ptsFileDownload(query) {
return request({
url: baseUrl +'/fileDownload',
method: 'post',
data: query,
responseType: 'arraybuffer'
})
},

后台代码:

controller:

@RequestMapping(value = "/fileDownload", method = { RequestMethod.POST, RequestMethod.GET })
public String fileDownload(@RequestBody(required=true) PtsFileEntity fileEntity, HttpServletResponse response) throws Exception {
medicineListService.fileDownload(fileEntity, response);
return null;
}

service接口

public interface MedicineListService extends IService<DrugData> {
  void fileDownload(PtsFileEntity fileEntity, HttpServletResponse response) throws Exception;
}

service实现类


@Override
public void fileDownload(PtsFileEntity fileEntity, HttpServletResponse response) throws Exception {
String fileName = fileEntity.getFileName();
if (null == fileName || ("").equals(fileName.trim())) {
logger.error("No FileName Found.");
throw new Exception("No FileName Found.");
}
String downloadChannel = fileEntity.getDownloadChannel();
if (null == downloadChannel || ("").equals(downloadChannel.trim())) {
logger.error("Need to identity download channel.");
throw new Exception("Need to identity download channel.");
}
if (CHANNEL_DIR.equalsIgnoreCase(downloadChannel)) {
this.downloadFromDir(fileEntity, response);
} else if (CHANNEL_URL.equalsIgnoreCase(downloadChannel)) {
this.downloadFromUrl(fileEntity, response);
}
}
/**
* 从URL地址下载
*
* @param fileEntity
* @param response
* @throws Exception
*/
private void downloadFromUrl(PtsFileEntity fileEntity, HttpServletResponse response) throws Exception {
String filePath = fileEntity.getFilePath();
String serverFilePath = fileEntity.getServerFilePath();
if ((null == filePath || ("").equals(filePath.trim())) && (null == serverFilePath || ("").equals(serverFilePath.trim()))) {
logger.error("No FilePath Found.");
throw new Exception("No FilePath Found.");
}
String realFilePath = (null == filePath || ("").equals(filePath.trim())) ? serverFilePath : filePath;
logger.info("Begin download file from Url: " + realFilePath);

try {
URL url = new URL(realFilePath);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置超时间为3秒
conn.setConnectTimeout(3 * 1000);
//防止屏蔽程序抓取而返回403错误
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

//得到输入流
InputStream inputStream = conn.getInputStream();
//获取自己数组
byte[] srcBytes = readInputStream(inputStream);
this.download(fileEntity, response);
} catch (IOException e) {
e.printStackTrace();
throw new Exception(e);
}
}
/**
* 从输入流中获取字节数组
*
* @param inputStream
* @return
* @throws IOException
*/
public static byte[] readInputStream(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((len = inputStream.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.close();
return bos.toByteArray();
}

/**
* 创建临时文件
*
* @param fileEntity
* @param srcBytes
*/
public void downloadFromDir(PtsFileEntity fileEntity, HttpServletResponse response) throws Exception {
String filePath = fileEntity.getFilePath();
String serverFilePath = fileEntity.getServerFilePath();
if ((null == filePath || ("").equals(filePath.trim())) && (null == serverFilePath || ("").equals(serverFilePath.trim()))) {
logger.error("No FilePath Found.");
throw new Exception("No FilePath Found.");
}
String realFilePath = (null == filePath || ("").equals(filePath.trim())) ? serverFilePath : filePath;
logger.info("Begin download file from Directory: " + realFilePath);
fileEntity.setRealFilePath(realFilePath);
try {
// 以流的形式下载文件。
InputStream fis;
fis = new BufferedInputStream(new FileInputStream(realFilePath));
byte[] srcBytes = new byte[fis.available()];
fis.read(srcBytes);
fis.close();
this.download(fileEntity, response);
} catch (IOException ex) {
ex.printStackTrace();
throw new Exception(ex);
}
}

/**
* 拼接response header 并已流的形式下载文件
*
* @param fileEntity
* @param response
* @throws Exception
*/
public void download(PtsFileEntity fileEntity, HttpServletResponse response) throws Exception {
String fileName = fileEntity.getFileName();
String realFilePath = fileEntity.getRealFilePath();
File file = new File(realFilePath);

try {
// 以流的形式下载文件。
InputStream fis;
fis = new BufferedInputStream(new FileInputStream(realFilePath));
byte[] srcBytes = new byte[fis.available()];
fis.read(srcBytes);
fis.close();

// 清空response
response.reset();
// 设置response的Header
response.setHeader("Content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("utf-8");//设置编码集,文件名不会发生中文乱码

response.setContentType("application/force-download");//
response.setHeader("content-type", "application/octet-stream");
response.addHeader("Content-Disposition", "attachment;fileName=" + new String(fileName.getBytes(), "utf-8"));// 设置文件名
response.addHeader("Content-Length", "" + file.length());
response.setHeader("Access-Control-Allow-Origin", "*");
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
toClient.write(srcBytes);
toClient.flush();
toClient.close();
} catch (IOException ex) {
throw new Exception(ex);
}
}

如果报错:The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'

解决:将request.js中的withCredentials由true改为false

const service = axios.create({
baseURL: "http://localhost:8080/drugques",
withCredentials: false,
timeout: 150000
});

文件下载:报错The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'的更多相关文章

  1. 微信小程序WebSocket报错:Error during WebSocket handshake: Sent non-empty 'Sec-WebSocket-Protocol' header but no response was received

    Error during WebSocket handshake: Sent non-empty 'Sec-WebSocket-Protocol' header but no response was ...

  2. python webdriver 报错WebDriverException: Message: can't access dead object的原因(pycharm中)

    PyCharm中运行firefox webdriver访问邮箱添加通讯录的时候报错-WebDriverException: Message: can't access dead object 调了半天 ...

  3. 【Mac 10.13.0】安装 libimobiledevice,提示报错:warning: unable to access '/Users/lucky/.config/git/attributes': Permission denied解决方案

    打开终端,执行命令: 1.sudo chown -R XXX /usr/local  (XXX表示当前用户名) 2.ruby -e "$(curl -fsSL https://raw.git ...

  4. mysql忘记root密码或报错:ERROR 1044 (42000): Access denied for user ”@’localhost’ to database ‘xx‘

    有的时候忘记了root密码或其他用户的密码,登录的时候报错:ERROR 1044 (42000): Access denied for user ”@’localhost’ to database ' ...

  5. Access control allow origin 简单请求和复杂请求

    原文地址:http://blog.csdn.net/wangjun5159/article/details/49096445 错误信息: XMLHttpRequest cannot load http ...

  6. Ubuntu下MySQL报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    在Ubuntu下 想要登录mysql数据库 root@JD:~# mysql -uroot -p 报错 ERROR 1045 (28000): Access denied for user 'root ...

  7. 【问题与解决】Mac OS通过 npm 安装 React Native 报错(checkPermissions Missing write access to /usr/local/lib/node_modules)

    报错情况: 当Mac OS通过 npm 安装 React Native 报错,警告文字为:checkPermissions Missing write access to /usr/local/lib ...

  8. 报错:PermissionError: [WinError 5] Access is denied: 'C:\\Program Files\\Anaconda3\\Lib\\site-packages\\pywebhdfs'

    Outline 在本(Windows系统)地往 “PAI”(hdfs)上上传数据时,需要安装pywebhdfs包,然后就报错了: 报错信息: PermissionError: [WinError 5] ...

  9. CM使用MySQL数据库预处理scm_prepare_database.sh执行报错:java.sql.SQLException: Access denied for user 'scm'@'hadoop101.com' (using password: YES)

    1.报错提示: [root@hadoop101 ~]# /opt/module/cm/cm-/share/cmf/schema/scm_prepare_database.sh mysql cm -hh ...

随机推荐

  1. BGP总结(一)

    0.AS 狭义:在RIP.OSPF和EIGRP等IGP协议中,AS表示只运行此单种协议的路由域 广义:运行多个IGP协议的路由域,多个IGP协议之间通过路由重发布来实现通信,AS和AS之间通过BGP来 ...

  2. 在 .NET Core Logging中使用 Trace和TraceSource

    本文介绍了在.NET Core中如何在组件设计中使用Trace和TraceSource. 在以下方面会提供一些帮助: 1.你已经为.NET Framework和.NET Core / .NET Sta ...

  3. 2019 Multi-University Training Contest 4.Divide the Stones(贪心)

    题意:给你n和k (k|n) 有n个数 第i个数权值为i 要你求权值相同且分成k组 且每组的个数为n/k 思路:恶心构造题,首先对于总权值不能分为k份的 显然不能分成 然后 我们把n/k 分奇偶 我们 ...

  4. hdu5884 Sort(二分)

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  5. Codeforces Global Round 9 E. Inversion SwapSort

    题目链接:https://codeforces.com/contest/1375/problem/E 题意 给出一个大小为 $n$ 的数组 $a$,对数组中的所有逆序对进行排序,要求按照排序后的顺序交 ...

  6. HDU - 2825 Wireless Password (AC自动机+状压DP)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2825 题意:给一些字符串,构造出长度为n的字符串,它至少包含k个所给字符串,求能构造出的个数. 题解: ...

  7. hdu 3549Flow Problem

    Problem Description Network flow is a well-known difficult problem for ACMers. Given a graph, your t ...

  8. UVA442 矩阵链乘 Matrix Chain Multiplication

    题意: 这道题也是在不改变原序列每个元素位置的前提下,看每个元素与他身边的两个元素那个先结合能得到最大的能量 题解: 很明显这是一道区间dp的题目,这道题要断环成链,这道题需要考虑在这个区间上某个元素 ...

  9. Codeforces Round #274 (Div. 2) C. Exams (贪心)

    题意:给\(n\)场考试的时间,每场考试可以提前考,但是记录的是原来的考试时间,问你如何安排考试,使得考试的记录时间递增,并且最后一场考试的时间最早. 题解:因为要满足记录的考试时间递增,所以我们用结 ...

  10. Codeforces Round #644 (Div. 3) D. Buying Shovels (数学)

    题意:商店里有\(k\)个包裹,第\(i\)个包裹中含有\(i\)个物品,现在想要买\(n\)物品,你可以选择某一个包裹购买任意次,使得物品数刚好等于\(n\),求最少的购买次数. 题解:首先,假如\ ...