

C# 上传压缩包, 把压缩中目录和图片按照原顺序不变进行上传到图片库
思路: 1: 接收压缩包并保存, 2: 读取保存的压缩包, 3, 上传里面的目录和图片,4:查询显示的时候用无限级分类即可
var data = ZipFile.Open("test.zip");
data 形式如下:
test1/
test1/test1/
test1/test1/test1.png
test1/test2/
test1/test2/test2.png
// model
/// 图片文件
public class PictureFile : EntityBase
{
/// <summary>
/// 文件名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 文件描述
/// </summary>
public string Description { get; set; }
/// <summary>
/// 原始文件保存位置
/// </summary>
public string OriginalFilePath { get; set; }
/// <summary>
/// 目录Id
/// </summary>
public Guid DirectoryId { get; set; }
/// <summary>
/// 用户Id
/// </summary>
public Guid UserId { get; set; }
/// <summary>
/// 文件扩展名
/// </summary>
public string FileExtension { get; set; }
public bool Handled { get; set; }
public Guid PictureId { get; set; }
public string CloudUrl { get; set; }
public Guid? MediaDirectoryId { get; set; }
}
// 目录
public class MediaDirectory : EntityBase
{
public virtual Guid? ParentId { get; set; }
[Required] [MinLength(1)] public string Name { get; set; }
public Guid UserId { get; set; }
public virtual ICollection<MediaDirectory> Cescendants { get; set; }
public virtual MediaDirectory Parent { get; set; }
/// <summary>
/// 图片列表
/// </summary>
public List<PictureFile> Children { get; set; }
}
// VModel
public class MediaDirectoryVM : VMBase<Guid>
{
/// <summary>
/// 父级ID
/// </summary>
public Guid? ParentId { get; set; }
/// <summary>
/// 名称
/// </summary>
[Required]
[MinLength(1)]
public string Name { get; set; }
/// <summary>
/// 用户ID
/// </summary>
public Guid UserId { get; set; }
public List<MediaDirectoryVM> Cescendants { get; set; }
public bool HasChild { get; set; }
}
private static Dictionary<string, string> _configDic = new Dictionary<string, string>
{
{"image/png", "png"},
{"image/x-png", "png"},
{"image/jpeg", "jpg"},
{"image/x-jpeg", "jpg"},
{"image/bmp", "bmp"},
{"application/zip", "zip" },
{"png","png" },
{"jpg","jpg" },
{"jpeg","jpg" },
{"bmp","bmp" },
{"gif","gif" },
};
Dictionary<string, Guid> _directory = new Dictionary<string, Guid>();
var file = Request.Form.Files[0];
if (_configDic[file.ContentType] == "zip")
{
if (!Directory.Exists($@"wwwroot\zip"))
{
Directory.CreateDirectory($@"wwwroot\zip");
}
var tmpFilePath = Path.Combine($@"wwwroot\zip\", $"{Guid.NewGuid()}.zip");
using (var fs = System.IO.File.Create(tmpFilePath))
{
file.CopyTo(fs);
fs.Flush();
}
var zipfile = ZipFile.Open(tmpFilePath, ZipArchiveMode.Read, Encoding.GetEncoding("gb2312"));
// 是否是目录
bool IsDir(ZipArchiveEntry entry)
{
return (entry.Length == 0 && string.IsNullOrEmpty(entry.Name));
}
// 获取父级目录
string GetParentDir(ZipArchiveEntry entry)
{
if (entry.FullName.TrimEnd('/').Contains("/"))
{
return entry.FullName.TrimEnd('/').Substring(0, entry.FullName.TrimEnd('/').LastIndexOf("/", StringComparison.InvariantCultureIgnoreCase));
}
else
{
return "";
}
}
// 是否是根目录
bool IsRootDir(ZipArchiveEntry entry)
{
var fullName = entry.FullName.TrimEnd('/');
return !fullName.Contains("/");
}
// 获取目录名
string GetDirName(ZipArchiveEntry entry)
{
if (IsRootDir(entry))
{
return entry.FullName.TrimEnd('/');
}
else if (IsDir(entry))
{
var str = entry.FullName.TrimEnd('/');
return str.Substring(str.LastIndexOf('/') + 1);
}
else
{
return entry.FullName.TrimEnd('/').Substring(0, entry.FullName.TrimEnd('/').LastIndexOf("/",
StringComparison.InvariantCultureIgnoreCase));
}
}
// 获取文件后缀名
string GetFileExt(ZipArchiveEntry entry)
{
if (string.IsNullOrEmpty(entry.Name))
{
return "";
}
string[] arrays = entry.Name.Split(new char[] { '.' });
var list = arrays.ToList();
return list[list.Count – 1];
}
var dic = new Dictionary<string, Guid>();
try
{
foreach (var entry in zipfile.Entries)
{
if (IsDir(entry)) // 是否是目录
{
if (IsRootDir(entry)) //是否是根目录
{
// 创建目录/文件夹
var dirResult = DirectoryService.AddDirectory(new CreateMediaDirectoryVM() { Name = GetDirName(entry), ParentId = uploadVm.DirectoryId });
if (dirResult.Data != null)
dic[entry.FullName.TrimEnd(‘/’)] = dirResult.Data.Id;
}
else
{
try
{
// 普通目录则找到父级目录id,创建文件夹
var vm = new CreateMediaDirectoryVM()
{
Name = GetDirName(entry),
ParentId = dic[GetParentDir(entry)]
};
var dirResult = DirectoryService.AddDirectory(vm);
if (dirResult.Data != null)
dic[entry.FullName.TrimEnd(‘/’)] = dirResult.Data.Id;
}
catch (Exception e)
{
Console.WriteLine(e);
return FastResponse.Response<PictureFileVM>(HttpStatusCode.BadRequest, null,
"上传目录创建失败, 请重试");
}
}
}
else
{
// 是图片则找到父级目录ID发消息上传, 不是png,jpg, jpeg或bmp格式的文件直接跳过
var fileExt = GetFileExt(entry);
if (fileExt == "png" || fileExt == "jpg" || fileExt == "jpeg" || fileExt == "bmp")
{
var path = Path.Combine($@"wwwroot\Images\{dic[GetParentDir(entry)]}");
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
var newFileId = Guid.NewGuid();
var newFileName = newFileId + "." + fileExt;
var newFileFullName = Path.Combine(path, newFileName);
System.IO.File.WriteAllBytes(newFileFullName, new BinaryReader(entry.Open()).ReadBytes((int)entry.Length));
var newPictureVM = new CreatePictureFileVM
{
Name = entry.Name,
Description = "压缩包上传的文件/图片",
OriginalFilePath = newFileFullName,
PictureId = newFileId,
DirectoryId = dic[GetParentDir(entry)]
};
Service.CreatePictureFile(newPictureVM);
}
}
}
return FastResponse.Response<PictureFileVM>(HttpStatusCode.OK, null, "压缩包上传成功");
}
catch (Exception e)
{
Console.WriteLine(e);
return FastResponse.Response<PictureFileVM>(HttpStatusCode.BadRequest, null,
"上传失败, 请重试");
}
}
3: 前台获取目录树:
public Response<MediaDirectoryVM> GetPictureFileTree()
{
var dirResponse =
DirecotyRepository.FirstOrDefault(e =>
e.UserId == Context.GetCustomerServiceId() && e.ParentId == null);
if (dirResponse == null)
{
var dirNew = new MediaDirectory()
{
Name = "默认目录",
ParentId = null,
UserId = Context.GetCustomerServiceId()
};
if (DirecotyRepository.Insert(dirNew))
{
return FastResponse.Response(HttpStatusCode.OK, Mapper.Map<MediaDirectoryVM>(dirNew));
}
FastResponse.Response<MediaDirectoryVM>(HttpStatusCode.BadRequest, null, "新建默认目录失败");
}
var data = GetPicTree(dirResponse.Id);
try
{
dirResponse.Cescendants = data;
return FastResponse.Response(HttpStatusCode.OK, Mapper.Map<MediaDirectoryVM>(dirResponse));
}
catch (Exception e)
{
Console.WriteLine(e);
return FastResponse.Response<MediaDirectoryVM>(HttpStatusCode.BadRequest, null, e.ToString());
}
}
public List<MediaDirectory> GetPicTree(Guid parentId)
{
var directoryVm = new List<MediaDirectory>();
var dirData = DirecotyRepository.Find(e =>
e.UserId == Context.GetCustomerServiceId() && e.ParentId == parentId);
foreach (var dataItem in dirData.ToList())
{
var dir = new MediaDirectory();
dir.Cescendants = GetPicTree(dataItem.Id);
dir.Name = dataItem.Name;
dir.UserId = dataItem.UserId;
dir.ParentId = dataItem.ParentId;
dir.Id = dataItem.Id;
dir.IsEnable = dataItem.IsEnable;
dir.CreateOn = dataItem.CreateOn;
directoryVm.Add(dir);
}
return directoryVm;
}
实现效果如下: