上传类主要是涉及上传的
比如文件或者图片
主要涉及的信息有
1.告知服务端存储在哪里
2.有什么规则限定,比如如何裁剪
3.使用哪个接口地址上传
文件上传的返回数据格式为
/// <summary>
///
/// </summary>
public class WangEditorUpload
{
/// <summary>
/// 有几个错误
/// </summary>
public int errno { get; set; } = 0;
/// <summary>
/// 数据集
/// </summary>
public List<WangEditorUploadItem> data { get; set; }
}
/// <summary>
///
/// </summary>
public class WangEditorUploadItem
{
/// <summary>
///
/// </summary>
public string url { get; set; }
/// <summary>
///
/// </summary>
public string alt { get; set; }
/// <summary>
///
/// </summary>
public string href { get; set; }
/// <summary>
/// 资源大小
/// </summary>
public long size { get; set; }
}
当前特性可以作用于所有的Dto中,具体的样式由前端决定,支持单图和多图模式
字段 | 类型 | 示例 | 说明 |
---|---|---|---|
args1 | 数字 | 1 | 图片数量 |
args2 | 字符 | cate | 存放在什么位置,上传图片的时候会附带到参数type中,应该就是一个字母!回传给api的参数为type |
args3 | 字符 | 60*60 | 图片是否需要压缩,压缩的宽高,比如60*0,回传的参数为size |
args4 | 字符 | small | small,normal,big表示图片的大小三个规格,默认normal,如果要返回格式,则由dataFrom决定 |
服务端示例代码可以在案例项目中的UploadController文件中看到
/// <summary>
/// 上传图片
/// </summary>
/// <returns></returns>
[HttpPost]
[TypeFilter(typeof(RoleAttribute), Arguments = new object[] { "data", "view" })]
public WangEditorUpload UpImage(string type = "head", string size = "")
{
var one = new WangEditorUpload();
one.errno = 1;
var _month = DateTime.Now.ToString("yyyyMM");
if (base.Request.Form != null)
{
if (base.Request.Form.Files != null)
{
if (base.Request.Form.Files.Count > 0)
{
one.errno = 0;
one.data = new List<WangEditorUploadItem>();
for (var k = 0; k < base.Request.Form.Files.Count; k++)
{
var finput = base.Request.Form.Files[k];
//这里还要进行文件后缀的过滤
var item = new WangEditorUploadItem();
var extension = System.IO.Path.GetExtension(finput.FileName);
if (String.IsNullOrEmpty(extension))
{
extension = ".jpg";
}
else
{
if (!extension.StartsWith("."))
{
extension = "." + extension;
}
}
if (extension != ".gif")
{
extension = ".webp";
}
var filename = $"{finput.FileName}{k}{DateTimeOffset.Now.ToUnixTimeMilliseconds()}".ToMd5Lower();
var _char = Path.DirectorySeparatorChar.ToString();
var savepath = $"upload/{type}/{_month}/{filename}{extension}";
var path = System.IO.Path.GetDirectoryName(savepath);
if (!System.IO.Directory.Exists(path)) { System.IO.Directory.CreateDirectory(path); }
if (System.IO.File.Exists(savepath)) { System.IO.File.Delete(savepath); }
item.alt = finput.FileName;
item.href = $"/{savepath}";
item.url = $"/{savepath}";
if (IsImageExtension(finput.FileName))
{
var _width = 0;
var _height = 0;
if (!String.IsNullOrEmpty(size))
{
var _sizes = size.Split('*');
int.TryParse(_sizes[0], out _width);
int.TryParse(_sizes[1], out _height);
}
using var image = Image.Load<Rgba32>(finput.OpenReadStream());
if (image.Width > _width && _width != 0)
{
image.Mutate(x => x.Resize(_width, _height));
}
else
{
if (image.Height > _height && _height != 0)
{
image.Mutate(x => x.Resize(_width, _height));
}
}
if (extension == ".webp")
{
image.Save(savepath, new WebpEncoder());
}
else
{
image.Save(savepath);
}
item.url = $"/{savepath}";
finput.OpenReadStream().Dispose();
}
else
{
using (FileStream fs = new FileStream(savepath, FileMode.Create))
{
finput.CopyTo(fs);
fs.Flush();
}
}
item.size = finput.Length;
one.data.Add(item);
}
}
}
}
return one;
}
默认后端的地址为/api/app/Upload/UpImage
字段 | 类型 | 示例 | 说明 |
---|---|---|---|
args1 | 字符 | /api/app/Upload/UpImage | 表示上传的路径,默认是/api/app/Upload/UpFile,你也可以自己修改他,args1或者args3必填其中一个 |
args2 | 字符 | file | datadir |
args3 | 字符 | global_upload_file(this); | onchange函数 |
args4 | 字符 | 待定 | 为后续扩展做准备 |
这个特性的设定是比较灵活的,比如可以使用默认的地址,或者指定地址上传
如果需要自己写逻辑还可以使用args3参数,自己设定function来执行!
args4我感觉可以用于文件后缀的限定
服务端的默认接收文件的代码如下
/// <summary>
/// 上传文件
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
[HttpPost]
[TypeFilter(typeof(RoleAttribute), Arguments = new object[] { "data", "view" })]
public WangEditorUpload UpFile(string type = "file")
{
var one = new WangEditorUpload();
one.errno = 1;
if (base.Request.Form != null)
{
if (base.Request.Form.Files != null)
{
if (base.Request.Form.Files.Count > 0)
{
one.errno = 0;
one.data = new List<WangEditorUploadItem>();
for (var k = 0; k < base.Request.Form.Files.Count; k++)
{
var finput = base.Request.Form.Files[k];
//这里还要进行文件后缀的过滤
var item = new WangEditorUploadItem();
var extension = System.IO.Path.GetExtension(finput.FileName);
var filename = $"{finput.FileName}{k}{DateTimeOffset.Now.ToUnixTimeMilliseconds()}".ToMd5Lower();
var savepath = $"upload/{type}/{filename}.{extension}";
var path = System.IO.Path.GetDirectoryName(savepath);
if (!System.IO.Directory.Exists(path)) { System.IO.Directory.CreateDirectory(path); }
item.alt = finput.FileName;
item.href = $"/{savepath}";
item.url = $"/{savepath}";
using var image = Image.Load<Rgba32>(finput.OpenReadStream());
image.Mutate(x => x.Resize(0, 180));
image.Save(savepath);
item.url = $"/{savepath}";
finput.OpenReadStream().Dispose();
item.size = finput.Length;
one.data.Add(item);
}
}
}
}
return one;
}