/// <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);
}
}
Asp.Net Core Webapi 文件上传、下载、删除常用功能接口
于 2024-06-06 15:08:40 首次发布