多种上传场景分析
本地上传和云上传
本地上传:方便快捷
云上传:通用但要对接API
使用策略模式+工厂模式实现
工厂模式:解决创建对象问题,不同策略对应不同类,通过工厂去实例化类,只需通过枚举传进去使用
C#
//枚举工具类
namespace Model.Enum
{
public enum UploadMode
{
Local = 1,
Cloud = 2
}
}
策略模式:策略文件夹FileStategy
![](https://ichistudio.cn/wp-content/uploads/2023/09/图片-10.png)
Strategy
C#
/// <summary>
/// 文件操作抽象类
/// </summary>
public abstract class Strategy
{
public abstract Task<string> UpLoad(List<IFormFile> formFiles);
}
LocalStrategy
C#
public class LocalStrategy : Strategy
{
/// <summary>
///实现抽象类、本地上传逻辑
/// </summary>
/// <param name="formFiles"></param>
/// <returns></returns>
public override async Task<string> UpLoad(List<IFormFile> files)
{
var res = await Task.Run(() =>
{
List<string> result = new List<string>();
foreach (var formfile in files)
{
//判断文件长度是否大于0,如果大于0说明存在文件内容
if (formfile.Length>0)
{
var filePath = $"{AppContext.BaseDirectory}/wwwroot";
//不能存绝对路径
var fileName = $"/{DateTime.Now:yyyyMMddHHmmssffff}{formfile.FileName}";
//判断文件夹是否存在,不能用于判断文件是否存在
if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
}
using(var stream = File.Create(filePath + fileName))
{
formfile.CopyTo(stream);
}
result.Add(fileName);
}
}
return string.Join(",",result);
});
return res;
}
}
CloudStrategy
C#
public class CloudStrategy : Strategy
{
public override async Task<string> UpLoad(List<IFormFile> files)
{
var res = await Task.Run(() =>
{
Mac mac = new Mac("xx", "xx");
List<string> result = new List<string>();
foreach (var formfile in files)
{
//判断文件长度是否大于0,如果大于0说明存在文件内容
if (formfile.Length > 0)
{
var filePath = $"{AppContext.BaseDirectory}/wwwroot";
//不能存绝对路径
var fileName = $"/{DateTime.Now:yyyyMMddHHmmssffff}{formfile.FileName}";
//判断文件夹是否存在,不能用于判断文件是否存在
if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
}
using(var stearm = File.Create($"{filePath}/{fileName}"))
{
formfile.CopyTo(stearm);
}
//上传文件名
string key = fileName;
//本地文件路径
string filePath_Local = $"{filePath}/{fileName}";
//存储空间名
string Bucket = "ichiupload";
//设置上传策略
PutPolicy putPolicy = new PutPolicy();
//设置要上传的目标空间
putPolicy.Scope = Bucket;
//上传策略的过期时间(单位:秒)
//putPolicy.SetExpires(3600);
//文件上传完成后,在多少天会自动删除
putPolicy.DeleteAfterDays = 0;
//生成上传Token
string token = Auth.CreateUploadToken(mac,putPolicy.ToJsonString());
Config config = new Config();
//设置上传区域
config.Zone = Zone.ZONE_CN_South;
//设置http或https上传
config.UseHttps = true;
config.UseCdnDomains = true;
//表单上传
FormUploader target = new FormUploader(config);
HttpResult httpResult = target.UploadFile(filePath_Local, key, token, null);
result.Add(filePath_Local);
//删除备份文件夹(先上传到本地然后上传云,删除的本地文件夹)
Directory.Delete(filePath,true);
}
}
return string.Join("",result);
});
return res;
}
}
FileContext
C#
//通过上下文调用具体的策略
public class FileContext
{
//通过构造函数传参
private Strategy _strategy;
private List<IFormFile> _files;
public FileContext(Strategy strategy,List<IFormFile> formFiles)
{
_files = formFiles;
_strategy = strategy;
}
public async Task<string> ContextInterFace()
{
return await _strategy.UpLoad(_files);
}
}
FileFactory
C#
/// <summary>
/// 工厂类负责对象的实例化
/// </summary>
public class FileFactory
{
public static Strategy CreateStrategy(UploadMode mode)
{
switch (mode)
{
case UploadMode.Local:
return new LocalStrategy();
case UploadMode.Cloud:
return new CloudStrategy();
default: return new CloudStrategy();
}
}
}
最后实现接口和服务
IFileService
C#
public interface IFileService
{
Task<string> Upload(List<IFormFile> formFiles, UploadMode mode);
}
FileService
C#
public class FileService : IFileService
{
public async Task<string> Upload(List<IFormFile> formFiles, UploadMode mode)
{
FileContext fileContext = new FileContext(FileFactory.CreateStrategy(mode),formFiles);
return await fileContext.ContextInterFace();
}
}
1.本地上传功能实现
在策略中编写逻辑
LocalStrategy
C#
public class LocalStrategy : Strategy
{
/// <summary>
///实现抽象类、本地上传逻辑
/// </summary>
/// <param name="formFiles"></param>
/// <returns></returns>
public override async Task<string> UpLoad(List<IFormFile> files)
{
var res = await Task.Run(() =>
{
List<string> result = new List<string>();
foreach (var formfile in files)
{
//判断文件长度是否大于0,如果大于0说明存在文件内容
if (formfile.Length>0)
{
var filePath = $"{AppContext.BaseDirectory}/wwwroot";
//不能存绝对路径
var fileName = $"/{DateTime.Now:yyyyMMddHHmmssffff}{formfile.FileName}";
//判断文件夹是否存在,不能用于判断文件是否存在
if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
}
using(var stream = File.Create(filePath + fileName))
{
formfile.CopyTo(stream);
}
result.Add(fileName);
}
}
return string.Join(",",result);
});
return res;
}
}
2.云服务器上传功能实现(七牛云)
创建七牛云账户—>个人中心—>密钥管理
![](https://ichistudio.cn/wp-content/uploads/2023/09/图片-12-1024x327.png)
![](https://ichistudio.cn/wp-content/uploads/2023/09/图片-13-1024x358.png)
安装SDK,编写上传逻辑
![](https://ichistudio.cn/wp-content/uploads/2023/09/图片-11.png)
C#
public class CloudStrategy : Strategy
{
public override async Task<string> UpLoad(List<IFormFile> files)
{
var res = await Task.Run(() =>
{
Mac mac = new Mac("xx", "xx");
List<string> result = new List<string>();
foreach (var formfile in files)
{
//判断文件长度是否大于0,如果大于0说明存在文件内容
if (formfile.Length > 0)
{
var filePath = $"{AppContext.BaseDirectory}/wwwroot";
//不能存绝对路径
var fileName = $"/{DateTime.Now:yyyyMMddHHmmssffff}{formfile.FileName}";
//判断文件夹是否存在,不能用于判断文件是否存在
if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
}
using(var stearm = File.Create($"{filePath}/{fileName}"))
{
formfile.CopyTo(stearm);
}
//上传文件名
string key = fileName;
//本地文件路径
string filePath_Local = $"{filePath}/{fileName}";
//存储空间名
string Bucket = "ichiupload";
//设置上传策略
PutPolicy putPolicy = new PutPolicy();
//设置要上传的目标空间
putPolicy.Scope = Bucket;
//上传策略的过期时间(单位:秒)
//putPolicy.SetExpires(3600);
//文件上传完成后,在多少天会自动删除
putPolicy.DeleteAfterDays = 0;
//生成上传Token
string token = Auth.CreateUploadToken(mac,putPolicy.ToJsonString());
Config config = new Config();
//设置上传区域
config.Zone = Zone.ZONE_CN_South;
//设置http或https上传
config.UseHttps = true;
config.UseCdnDomains = true;
//表单上传
FormUploader target = new FormUploader(config);
HttpResult httpResult = target.UploadFile(filePath_Local, key, token, null);
result.Add(filePath_Local);
//删除备份文件夹(先上传到本地然后上传云,删除的本地文件夹)
Directory.Delete(filePath,true);
}
}
return string.Join("",result);
});
return res;
}
}