23.2、文件上传下载

文件上传下载也是应用系统和用户交互必备功能。

文件下载

代码如下:

[HttpGet]
[Route("~/api/sales/FileDownload")]
public IActionResult FileDownload(string path, string fileName)
{
    string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
    return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}

文件上传

支持单文件、多文件上传,由于上传文件是耗时操作,所以尽量采用异步上传方式。代码如下:

public async Task<IActionResult> UploadFileAsync(List<IFormFile> files)
{
    long size = files.Sum(f => f.Length);

    foreach (var formFile in files)
    {
        if (formFile.Length > 0)
        {
            var filePath = Path.GetTempFileName();  // 可以替代为你需要存储的真实路径

            using (var stream = System.IO.File.Create(filePath))
            {
                await formFile.CopyToAsync(stream);
            }
        }
    }

    return Ok(new { count = files.Count, size });
}

前端Angular下载示例

Get请求

只需要通过 <a href='下载地址'>下载</a> 即可。

Post请求

// 导入HttpClient/HttpResponse 包
import { HttpClient, HttpResponse } from '@angular/common/http';

// 构造函数初始化
constructor(
    private httpClient: HttpClient
  ) { }

// 下载,第一个参数为post地址,第二个参数为post参数
this.httpClient.post('http://localhost:57310/api/Member/ExportMemberClaims', [{}], {
      responseType: 'blob',
      observe: 'events',
    }).subscribe((res: HttpResponse<Blob>) => {
      if (res.type !== 4) { return; }

      const objUrl = window.URL.createObjectURL(res.body);
      const a = document.createElement('a');
      a.href = objUrl;
      
      const fileName = 'excel.xlsx';  // 设置下载文件名
      a.download = decodeURIComponent(fileName);
      a.click();
      
      window.URL.revokeObjectURL(objUrl);
    });

文件上传下载推荐方式

通常我们将用户上传或提供下载的资源放在和源码同一服务器,这样用户下载和上传时会占用服务器内存资源,导致系统性能下降,所以我们通常将静态资源统一放在一台单独文件服务器中。由于自己托管文件服务器成本较高,所以推荐采用国内的 七牛云阿里云的 OSS 对象存储

最后更新于