源代码地址https://github.com/junkai-li/NetCoreKevin
基于NET6搭建跨平台WebApi架构支持单点登录、多缓存、自动任务、分布式、多租户、日志、授权和鉴权 、网关 注册与发现、CAP集成事件、领域事件、 docker部署
直接上代码
/**
*
* 获取图片
* key = 图片所在行 value = 图片对象 XSSFPictureData中的Data就是图片的文件流
* @param workbook
* @return Map(row,image);
*/
private static Dictionary<int, List<XSSFPictureData>> GetPicMap(XSSFWorkbook wb)
{
Dictionary<int, List<XSSFPictureData>> picMap = new Dictionary<int, List<XSSFPictureData>>();
var pictures = wb.GetAllPictures();
XSSFSheet sheet = (XSSFSheet)wb.GetSheetAt(0);
foreach (XSSFShape shape in sheet.GetDrawingPatriarch().GetShapes())
{
XSSFClientAnchor anchor = (XSSFClientAnchor)shape.GetAnchor();
List<XSSFPictureData> list = new List<XSSFPictureData>();
if (shape is XSSFPicture) {
XSSFPicture pic = (XSSFPicture)shape;
var picture = (XSSFPicture)shape;
XSSFPictureData picData = (XSSFPictureData)picture.PictureData;
//如果通过本次获取的行能得到value,说明本行已存在,
if (picMap.Where(x => x.Key == anchor.Row1).Count() > 0)
{
//找到本行的集合
List<XSSFPictureData> list2 = picMap.Where(x=>x.Key==anchor.Row1).FirstOrDefault().Value;
//将图片存储进去
list2.Add(picData);
//进入下一轮循环
continue;
}
//添加本次循环的图片对象
list.Add(picData);
//将本张图片的行信息作为key存入map,将图片对象作为值存储
picMap.Add(anchor.Row1, list);
}
else
{
//非图片数据则插入null
picMap.Add(anchor.Row1, null);
}
}
return picMap;
}
附获取图片dic之后 保存到本地并上传到OSS
products 是业务dtos
public static void UploadProductImgsAsync(Dictionary<int, List<XSSFPictureData>> keyValues, List<TProduct> products)
{
string basepath = "/Files/" + DateTime.Now.ToString("yyyy/MM/dd");
string filepath = Libraries.IO.Path.ContentRootPath() + basepath;
Directory.CreateDirectory(filepath);
using (dbContext db = new dbContext())
{
for (int i = 0; i < products.Count - 1; i++)
{
var keyvlue = keyValues.Where(x => x.Key == (i + 1)).FirstOrDefault();
var item = products[i];
if (keyvlue.Value != null && keyvlue.Value.Count() > 0)
{
foreach (XSSFPictureData picturedata in keyvlue.Value)
{
var file = picturedata.Data;
var fileName = Guid.NewGuid().ToString() + "." + picturedata.MimeType.Replace("image/", "");
var imgpath = filepath + "//" + fileName;
//这里是保存到本地
using (MemoryStream ms = new MemoryStream(file))
{
Image outputImg = Image.FromStream(ms);
outputImg.Save(imgpath, ImageFormat.Jpeg);
}
//using (FileStream fs = System.IO.File.Create(imgpath))
//{
// fs.Write(file, 0, file.Length);
// fs.Flush();
//}
var userId = item.CreateUserId;
string path = "";
var isSuccess = false;
if (file != null && file.Length > 0)
{
path = filepath + "/" + fileName;
var upRemote = true;
//这里是上传到oss
if (upRemote)
{
var oss = new Common.AliYun.OssHelper();
var upload = oss.FileUpload(path, "Files/" + DateTime.Now.ToString("yyyy/MM/dd"), fileName);
if (upload)
{
Common.IO.IOHelper.DeleteFile(path);
path = "/Files/" + DateTime.Now.ToString("yyyy/MM/dd") + "/" + fileName;
isSuccess = true;
}
}
else
{
path = basepath + "/" + fileName;
isSuccess = true;
}
}
if (isSuccess)
{
//存入数据库
var f = new TFile();
f.Id = Guid.NewGuid();
f.IsDelete = false;
f.Name = fileName;
f.Path = path;
f.Table = "TProduct";
f.TableId = item.Id;
f.Sign = "Image";
f.CreateUserId = userId;
f.CreateTime = DateTime.Now;
db.TFile.Add(f);
db.SaveChanges();
}
else
{
//HttpContext.Response.StatusCode = 400;
//HttpContext.Items.Add("errMsg", "文件上传失败!");
//return default;
}
}
}
}
}
}