第一种方式:文件流方式上传
#region 文件上传方法 文件流
//目前限制150Mb以内,单位bytes
private const long MaxFileSize = 1024 * 1024 * 150;
// <summary>
/// 上传一个文件,并返回文件上传成功后的信息
/// </summary>
/// <param name="File">要上传的文件实体</param>
/// <returns>文件上传成功后返回的文件相关信息</returns>
[OpenApiOperation("Upload", "文件上传接口", "文件上传接口")]
[RequestSizeLimit(MaxFileSize)]
//public async Task<FileUploadOutputDto> UploadFile(IFormFile file, string newFileName)
public async void UploadFile(IFormFile file, string newFileName)
{
try
{
//文件的原始名称
string FileOriginName = file.FileName;
//读取文件保存的根目录
string fileSaveRootDir = _config.GetSection("CommonConfig:FilePath").Value; //ConfigHelper.GetAppSetting("App", "FileRootPath");
//文件保存的相对文件夹(保存到wwwroot目录下)
string absoluteFileDir = "/wwwroot" + fileSaveRootDir;
//文件保存的路径(应用的工作目录+文件夹相对路径);
string fileSavePath = Environment.CurrentDirectory + absoluteFileDir;
if (!Directory.Exists(fileSavePath))
{
Directory.CreateDirectory(fileSavePath);
}
//生成文件的名称
string Extension = Path.GetExtension(FileOriginName);//获取文件的源后缀
if (string.IsNullOrEmpty(Extension))
{
throw new BusinessException(message: "文件上传的原始名称好像不对哦,没有找到文件后缀");
}
//string fileName = FileOriginName.Split('.')[0] + Guid.NewGuid().ToString() + Extension; //Guid.NewGuid().ToString() + Extension;//通过uuid和原始后缀生成新的文件名
//最终生成的文件的绝对路径(xxx/xxx/xx.xx)
string finalyFilePath = fileSavePath + "/" + newFileName;
FileUploadOutputDto result = new FileUploadOutputDto();
//打开上传文件的输入流
Stream stream = file.OpenReadStream();
创建输入流的reader
var fileType = stream.GetFileType();
文件大小
//result.FileLength = stream.Length;
//result.FileName = FileOriginName;
//result.FileType = Extension.Substring(1);
//result.FileUrl = absoluteFileDir + "/" + fileName;
//开始保存拷贝文件
FileStream targetFileStream = new FileStream(finalyFilePath, FileMode.OpenOrCreate);
await stream.CopyToAsync(targetFileStream);
//return result;
}
catch (Exception ex)
{
throw new BusinessException(message: "文件上传失败," + ex.Message);
}
}
#endregion 文件上传方法 文件流
第二种方式:abp自带
注意:IBlobContainer blobContainer nuget包引用,以及包版本
下面代码不完整,相当于提供一个大概思路,用abp vNext自带的上传组件,代码量少一些,但引用包版本需要注意。
//目前限制150Mb以内,单位bytes
private const long MaxFileSize = 1024 * 1024 * 150;
IBlobContainer blobContainer
_blobContainer = blobContainer;
#region 文件上传abp自带
[RequestSizeLimit(MaxFileSize)]
public async Task<ApiResult<bool>> UploadFileAsync(CreateUpdateBusiMachineFilesInDto body)
{
var fileBytes = StreamToBytes(body.file.OpenReadStream());
var fileName = body.file.FileName.EnsureTrim();
var extension = Path.GetExtension(fileName).EnsureTrim();
var fileSize = fileBytes.Length;
var fileHash = GetBytesMd5(fileBytes);
var id = GuidGenerator.Create();
var filePath = $"{id}{extension}";
UploadFileAsync(filePath, fileBytes);
CreateUpdateBusiMachineFilesInDto inDto = new CreateUpdateBusiMachineFilesInDto()
{
WorkCenter = "",
MachineCode = "",
MachineFileCategory = extension,
FilePath = "",
FileName = fileName,
FileSize = fileSize.ToString(),
Op = "",
ProductCode = "",
WoNbr = "",
Note = ""
};
var entity = ObjectMapper.Map<CreateUpdateBusiMachineFilesInDto, BusiMachineFilesEntity>(inDto);
entity.ResetProp(nameof(entity.Id), id);
entity.AddCreatorName(AbpCurrentUser.LoginName)
.ResetStringProps();
await _busiMachineFilesRepo.InsertAsync(entity);
return true.ToApiResult();
//var file = new FileEntity(id)
//{
// FileSize = fileSize,
// Extension = extension,
// FileName = fileName,
// FilePath = filePath,
// FileHash = fileHash
//};
//await _programFileRepo.InsertAsync(file);
//await CurrentUnitOfWork.SaveChangesAsync();
//var result = file.ToJson().ToObject<ProgramFileOutDto>();
//return result.ToApiResult();
}
public async void UploadFileAsync(string filePath, byte[] fileBytes)
{
await _blobContainer.SaveAsync(filePath, fileBytes, true); //保存
}
#endregion 文件上传abp自带
#region 私有方法,接入文件存储服务之后,统一删除
private static byte[] StreamToBytes(Stream stream)
{
if (!stream.CanSeek || !stream.CanWrite)
{
using (var ms = new MemoryStream())
{
stream.CopyToAsync(ms).GetAwaiter().GetResult();
ms.Seek(0, SeekOrigin.Begin);
var bytes = new byte[ms.Length];
ms.Read(bytes, 0, bytes.Length);
ms.Close();
return bytes;
}
}
else
{
var bytes = new byte[stream.Length];
stream.Seek(0, SeekOrigin.Begin);
stream.Read(bytes, 0, bytes.Length);
stream.Seek(0, SeekOrigin.Begin);
return bytes;
}
}
private static string GetBytesMd5(byte[] fileBytes)
{
var md5 = new MD5CryptoServiceProvider();
var retVal = md5.ComputeHash(fileBytes);
var sb = new StringBuilder();
foreach (var rv in retVal)
{
sb.Append(rv.ToString("x2"));
}
return sb.ToString();
}
#endregion 私有方法,接入文件存储服务之后,统一删除