前端用vue,后端C#。写一个前端点击下载,从服务器上下载指定Excel: 后端文件存放:
后端接口:
public Stream DownloadTemplate(string name) { //获取文件存放URL var filePath = Path.Combine(Directory.GetCurrentDirectory(),path2:$"import_templates\\import_templates_{name}.xls"); using (var client = new WebClient()) { client.DownloadFile(filePath, name); return FileToStream(name, true); } } public static Stream FileToStream(string fileName, bool isDelete = false) { //打开文件 FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); // 读取文件的 byte[] byte[] bytes = new byte[fileStream.Length]; fileStream.Read(bytes, 0, bytes.Length); fileStream.Close(); // 把 byte[] 转换成 Stream Stream stream = new MemoryStream(bytes); if (isDelete) { File.Delete(fileName);//删除临时文件 } return stream; }前端代码:
接口文件:(.js文件) // 文件导入接口定义 let url = '/api/app/commonFileImport'; import qs from 'qs'; export default class Api { constructor(axios) { this.axios = axios || null; } async downloadTemplate(name){ return await this.axios({ url: `${url}/downloadTemplate`, responseType:'arraybuffer', method: 'post', params: {name}, }); } } 前端文件(.jsx文件) import ApiFileImport from '../../sm-api/sm-fileImport/fileImport'; //引用接口文件 let fileImport = new ApiFileImport(); export default { name: 'SmImportTemplate', components: {}, props: { axios: { type: Function, default: () => null }, ..., downloadKey: { type: String, default: null }, // 下载指定文件的标识,唯一 downloadFileName: { type: String, default: null}, // 下载指定文件的标识,唯一 }, method: { //这是实现方法: async download() { let response = await fileImport.downloadTemplate(this.downloadKey); //调接口 if (response != null && requestIsSuccess(response)) { if (response.data.byteLength != 0){ //这里downloadFileName和downloadKey都是这个组件从父组件接收的,前者是下载完的文件名,后者是传给后端的标识。 FileSaver.saveAs(new Blob([response.data], { type: this.fileType }), `${this.downloadFileName}` ? `${this.downloadFileName}` : `${this.downloadKey}`); this.$emit('success'); } } } }, };接口文件中接口配置: responseType:'arraybuffer', 这个不能少,否则下下来的东西是乱码的。
下载文件: FileSaver.saveAs(new Blob([response.data], { type: this.fileType }), ${this,downloadKey}); response.data是我返回来的文件流;this.fileType是文件类型,我定义的是’application/vnd.ms-excel’。最后那个就是下载完的文件名。
解决这个问题时碰到了如何更改目标框架的问题,详细如下: 在官网下载相应的框架,更改项目配置文件(我用的是VS2019):
//双击项目进入项目.csproj文件中:(右击项目 - 卸载项目 好像也能进这个文件) <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> //这个是.NET Standard 2.0 //<TargetFramework>net40</TargetFramework> 这个是.NET Framework 4.0 <RootNamespace>SnAbp.Common</RootNamespace> </PropertyGroup>更改完之后右击项目——属性——目标框架,选择需要的就行。 好像一般改了之后会报很多问题(我的是出现了问题,很多不兼容。)
