C#实现从服务器下载文件(以Excel为例)

前端用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>

更改完之后右击项目——属性——目标框架,选择需要的就行。
好像一般改了之后会报很多问题(我的是出现了问题,很多不兼容。)

Logo

前往低代码交流专区

更多推荐