Asp.Net Core Webapi 文件上传、下载、删除常用功能接口

 /// <summary>
 /// 上传
 /// </summary>
 /// <param name="folder">文件夹</param>
 /// <param name="files">文件</param>
 /// <returns></returns>
 [HttpPost("Upload")]
 public async Task<ExecResult> Upload(string folder, List<IFormFile> files)
 {
     var results = new List<FileUploadResult>();
     try
     {
         //1 KB = 1024 Bytes     1 MB = 1024 KB
         if (files == null || !files.Any()) throw new Exception("请选择文件上传!");
         var fileNames = files.Select(s => s.FileName).ToArray();
         if (!FileExtension.IsMatchFormat(fileNames)) throw new Exception("请上传正确格式的文件!");

         long limit = 25 * 1024 * 1024;//上限20M
         long totalSize = files.Sum(f => f.Length);
         if (totalSize > limit) throw new Exception("文件大小不能超过25M");
         string rootPath = _environment.ContentRootPath;
         string tagetDirectoryPath = Path.Combine(rootPath, rootDirectory, folder ?? "");
         if(!Directory.Exists(tagetDirectoryPath))
         {
             var directoryInfo = new DirectoryInfo(tagetDirectoryPath);
             directoryInfo.Create();
         }

         foreach (var formFile in files)
         {
             var result = new FileUploadResult();
             if (formFile.Length > 0)
             {
                 try
                 {
                     var guid = Guid.NewGuid();
                     string fileName = formFile.FileName;
                     string ext = Path.GetExtension(fileName);
                     string newFileName = guid.ToString()+ ext;
                     var filePath = Path.Combine(tagetDirectoryPath, newFileName);
                     using (var stream = System.IO.File.Create(filePath))
                     {
                         await formFile.CopyToAsync(stream);
                     }
                     
                     result.FileName = newFileName;
                     result.FilePath = Path.Combine(folder ?? "", newFileName)
                         .Replace("\\", "/");
                     result.IsSuccess = true;
                     results.Add(result);

                     #region 新增文件
                     var fileManage = new FileManage()
                     {
                         Name = formFile.FileName,
                         Path = result.FilePath,
                         Size = formFile.Length,
                         CreateTime = DateTime.Now
                     };
                     await _dbcontext.FileManages.AddAsync(fileManage);
                     #endregion
                 }
                 catch (Exception ex)
                 {
                     result.FilePath = Path.Combine(folder, formFile.FileName)
                         .Replace("\\", "/");
                     result.IsSuccess = false;
                     result.Message = ex.Message;
                     results.Add(result);
                 }
             }
             else
             {
                 result.FilePath = Path.Combine(folder, formFile.FileName)
                        .Replace("\\", "/");
                 result.IsSuccess = false;
                 result.Message = "文件大小为0kb;";
                 results.Add(result);
             }
         }
         await _dbcontext.SaveChangesAsync();
         return new ExecResult(true, results);
     }
     catch (Exception ex)
     {
         _logger.LogError(ex, "");
         return new ExecResult(false, "", ex.Message);
     }
 }

 /// <summary>
 /// 大文件上传(大一点的文件上传,并非真正的大文件)
 /// </summary>
 /// <param name="folder">文件夹</param>
 /// <param name="files">文件</param>
 /// <returns></returns>
 [HttpPost("BigFileUpload")]
 [DisableRequestSizeLimit]
 public async Task<ExecResult> BigFileUpload(string folder, List<IFormFile> files)
 {
     var results = new List<FileUploadResult>();
     try
     {
         //1 KB = 1024 Bytes     1 MB = 1024 KB
         if (files == null || !files.Any()) throw new Exception("请选择文件上传!");
         //var fileNames = files.Select(s => s.FileName).ToArray();
         //if (!FileExtension.IsMatchFormat(fileNames)) throw new Exception("请上传正确格式的文件!");

         long limit = 300 * 1024 * 1024;//上限20M
         long totalSize = files.Sum(f => f.Length);
         if (totalSize > limit) throw new Exception("文件大小不能超过300M");
         string rootPath = _environment.ContentRootPath;
         string tagetDirectoryPath = Path.Combine(rootPath, rootDirectory, folder ?? "");
         if (!Directory.Exists(tagetDirectoryPath))
         {
             var directoryInfo = new DirectoryInfo(tagetDirectoryPath);
             directoryInfo.Create();
         }

         foreach (var formFile in files)
         {
             var result = new FileUploadResult();
             if (formFile.Length > 0)
             {
                 try
                 {
                     var guid = Guid.NewGuid();
                     string fileName = formFile.FileName;
                     string ext = Path.GetExtension(fileName);
                     string newFileName = guid.ToString() + ext;
                     var filePath = Path.Combine(tagetDirectoryPath, newFileName);
                     using (var stream = System.IO.File.Create(filePath))
                     {
                         await formFile.CopyToAsync(stream);
                     }

                     result.FileName = newFileName;
                     result.FilePath = Path.Combine(folder ?? "", newFileName)
                         .Replace("\\", "/");
                     result.IsSuccess = true;
                     results.Add(result);

                     #region 新增文件
                     var fileManage = new FileManage()
                     {
                         Name = formFile.FileName,
                         Path = result.FilePath,
                         Size = formFile.Length,
                         CreateTime = DateTime.Now
                     };
                     await _dbcontext.FileManages.AddAsync(fileManage);
                     #endregion
                 }
                 catch (Exception ex)
                 {
                     result.FilePath = Path.Combine(folder, formFile.FileName)
                         .Replace("\\", "/");
                     result.IsSuccess = false;
                     result.Message = ex.Message;
                     results.Add(result);
                 }
             }
             else
             {
                 result.FilePath = Path.Combine(folder, formFile.FileName)
                        .Replace("\\", "/");
                 result.IsSuccess = false;
                 result.Message = "文件大小为0kb;";
                 results.Add(result);
             }
         }
         await _dbcontext.SaveChangesAsync();
         return new ExecResult(true, results);
     }
     catch (Exception ex)
     {
         _logger.LogError(ex, "");
         return new ExecResult(false, "", ex.Message);
     }
 }

 /// <summary>
 /// 下载
 /// </summary>
 /// <returns></returns>
 /// <exception cref="Exception"></exception>
 [HttpGet("Download")]
 public async Task<FileResult> Download([Required]string path)
 {
     try
     {
         string rootPath = _environment.ContentRootPath;
         string filePath = Path.Combine(rootPath, rootDirectory, path);
         var stream = System.IO.File.OpenRead(filePath);
         string fileExt = Path.GetExtension(filePath);
         //获取文件的ContentType
         var provider = new FileExtensionContentTypeProvider();
         var memi = provider.Mappings[fileExt];
         var fileManage = await _dbcontext.FileManages.FirstOrDefaultAsync(s=>s.Path.EndsWith(path));
         if (fileManage == null) throw new Exception("文件不存在!");

         return await Task.FromResult(File(stream, memi, Path.GetFileName(fileManage.Name)));
     }
     catch (Exception ex)
     {
         _logger.LogError(ex, "");
         throw new Exception(ex.Message);
     }
 }

 /// <summary>
 /// 删除(支持批量删除)
 /// </summary>
 /// <param name="filePaths">文件夹路径</param>
 /// <returns></returns>
 [HttpPost("Delete")]
 public async Task<ExecResult> Delete([Required]string[] filePaths)
 {
     var results = new List<FileUploadResult>();
     try
     {
         if (filePaths == null || (filePaths != null && !filePaths.Any())) throw new Exception("请选择文件删除!");
         List<string> deleteFilePaths = new List<string>();
         foreach (var filePath in filePaths)
         {
             //1 KB = 1024 Bytes     1 MB = 1024 KB
             string fullPath = Path.Combine(_environment.ContentRootPath, "AppFiles", filePath);
             if (System.IO.File.Exists(fullPath))
             {
                 System.IO.File.Delete(fullPath);
                 deleteFilePaths.Add(filePath);
             }
         }

         var files = await _dbcontext.FileManages.Where(s => deleteFilePaths.Contains(s.Path)).ToListAsync();
         if (files != null && files.Any())
         {
             _dbcontext.RemoveRange(files);
             await _dbcontext.SaveChangesAsync();
         }

         return new ExecResult(true, "ok");
     }
     catch (Exception ex)
     {
         _logger.LogError(ex, "");
         return new ExecResult(false, "", ex.Message);
     }
 }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值