3月 27, 2018 - .net, 循环遍历    2 Comments

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;
        }

实现效果如下:

评论被关闭。