zoukankan      html  css  js  c++  java
  • 文件帮助类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Configuration;
    using System.IO;
    using System.Collections.Specialized;
    using zhjy.BLL.w_disk;
    using zhjy.Model;
    using ICSharpCode.SharpZipLib.Zip;
    using Common.ToolsCommon;
    using zhjy.BLL.w_data;
    namespace Web.yunpan
    {
        public static class DiskHelp
        {
            /// <summary>
            /// 公共云盘根目录
            /// </summary>
            public static readonly string publicDiskBasePath;
    
            /// <summary>
            /// 个人云盘根目录
            /// </summary>
            public static readonly string privateDiskBasePath;
    
    
            static DiskHelp()
            {
                //publicDiskBasePath = ConfigurationManager.AppSettings["publicDiskBasePath"];
                //privateDiskBasePath = ConfigurationManager.AppSettings["privateDiskBasePath"];
                if (HttpContext.Current != null)
                {
                    publicDiskBasePath = HttpContext.Current.Server.MapPath("~/CloudDisk/PublicDoc");
                    privateDiskBasePath = HttpContext.Current.Server.MapPath("~/CloudDisk/PrivateDoc");
                }
                else
                {
                    publicDiskBasePath = System.Web.Hosting.HostingEnvironment.MapPath("~/CloudDisk/PublicDoc");
                    privateDiskBasePath = System.Web.Hosting.HostingEnvironment.MapPath("~/CloudDisk/PrivateDoc");
                }
            }
    
            /// <summary>
            /// 初始化生成文件夹
            /// </summary>
            /// <returns></returns>
            public static bool InitFolderList()
            {
                string msg = string.Empty;
                int userId = GetLoginUserId();
                IList<string> folderNameList = new List<string> { "", "", "", "", "" };
                string userPriverBasePath = Path.Combine(privateDiskBasePath, userId.ToString());
                if (!Directory.Exists(userPriverBasePath))//路径不存在初始化文件夹
                {
                    w_disk_folderBLL folderBLL = new w_disk_folderBLL();
                    foreach (var item in folderNameList)
                    {
                        string folderPath = string.Empty;
                        bool isSuc = CreateFolder(item, userId, ref msg, ref folderPath);
                        if (!isSuc)
                        {
                            return false;
                        }
    
                        folderBLL.Add(new w_disk_folder
                        {
                            folderName = item,
                            url = ToRelativePath(folderPath),
                            createrId = GetLoginUserId(),
                            createrName = GetLoginUserName(),
                            creatDate = DateTime.Now
                        });
                    }
                }
                return true;
            }
    
            /// <summary>
            /// 创建
            /// </summary>
            /// <param name="folderName"></param>
            /// <param name="userId"></param>
            /// <param name="msg"></param>
            /// <returns></returns>
            public static bool CreateFolder(string folderName, int userId, ref string msg, ref string path)
            {
                if (string.IsNullOrWhiteSpace(folderName))
                {
                    msg = "文件夹名不能为空";
                    return false;
                }
                path = Path.Combine(privateDiskBasePath, userId.ToString(), folderName);
                if (Directory.Exists(path))
                {
                    msg = "当前文件夹已存在";
                    return false;
                }
                Directory.CreateDirectory(path);
                return true;
            }
    
            public static bool RenameFolder(string oldFolderName, string newFolderName, int userId, ref string msg, ref string newPath)
            {
                if (string.IsNullOrWhiteSpace(oldFolderName) || string.IsNullOrWhiteSpace(newFolderName))
                {
                    msg = "文件夹名不能为空";
                    return false;
                }
                if (oldFolderName == newFolderName)
                {
                    msg = "文件夹命名重复";
                    return false;
                }
                string path = Path.Combine(privateDiskBasePath, userId.ToString(), oldFolderName);
                if (!Directory.Exists(path))
                {
                    msg = "当前文件夹不存在";
                    return false;
                }
                newPath = Path.Combine(privateDiskBasePath, userId.ToString(), newFolderName);
                Directory.Move(path, newPath);
                return true;
            }
    
            public static bool DeleteFolder(string folderName, int userId, ref string msg)
            {
                if (string.IsNullOrWhiteSpace(folderName))
                {
                    msg = "文件夹名不能为空";
                    return false;
                }
                string path = Path.Combine(privateDiskBasePath, userId.ToString(), folderName);
                if (!Directory.Exists(path))
                {
                    msg = "当前文件夹不存在";
                    return false;
                }
                DirectoryInfo dir = new DirectoryInfo(path);
                int fileCount = dir.GetFiles().Length;
                if (fileCount != 0)
                {
                    msg = "当前文件夹不为空,请先删除文件夹下的文件";
                    return false;
                }
                dir.Delete();
                return true;
            }
    
            public static bool UploadFile(string folderName, int userId, ref w_disk_file diskFile, ref string msg)
            {
                if (HttpContext.Current.Request.Files.Count == 0 || string.IsNullOrWhiteSpace(HttpContext.Current.Request.Files[0].FileName))
                {
                    msg = "当前没有文件上传";
                    return false;
                }
                HttpPostedFile file = HttpContext.Current.Request.Files[0];
    
                string fileName = Path.GetFileName(file.FileName);
                if (!IsFileNameValid(fileName))
                {
                    msg = "请勿在文件名中包含\ / : * ? " < > |等字符,请重新输入有效文件名!";
                    return false;
                }
                if (diskFile.typeId == "2" && !IsVideo(file))
                {
                    msg = "请上传视频文件";
                    return false;
                }
                if (!IsAllowedExtension(file))
                {
                    msg = "当前类型的文件不允许上传!";
                    return false;
                }
    
                string path = string.Empty;
                if (diskFile.isPublic)
                {
                    path = Path.Combine(publicDiskBasePath, folderName);
                }
                else
                {
                    path = Path.Combine(privateDiskBasePath, userId.ToString(), folderName);
                }
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }
                path = Path.Combine(path, RenameFileName(fileName));
                if (File.Exists(path))
                {
                    msg = fileName + "文件已存在!";
                    return false;
                }
                file.SaveAs(path);
                if (IsVideo(file) && Path.GetExtension(fileName) != ".mp4")
                {
                    //将视频转码加入队列
                    DiskTransCodQuenu.Add(path);
                }
                diskFile.url = ToRelativePath(path);
                diskFile.fileName = fileName;
                diskFile.createrId = userId;
                diskFile.creatDate = DateTime.Now;
                diskFile.viewCount = 0;
    
                diskFile.fileSize = GetMB(file.ContentLength);
                diskFile.format = Path.GetExtension(fileName).Replace(".", "");
                return true;
            }
    
            public static bool SimpleUploadFile(string uploadpath, bool isAbsolutePath, ref string msg, ref string uploadinfo)
            {
                if (HttpContext.Current.Request.Files.Count == 0)
                {
                    msg = "当前没有文件上传";
                    return false;
                }
                var files = HttpContext.Current.Request.Files;
                for (int i = 0; i < HttpContext.Current.Request.Files.Count; i++)
                {
                    string fileName = Path.GetFileName(files[0].FileName);
                    if (!IsFileNameValid(fileName))
                    {
                        msg = "请勿在文件名中包含\ / : * ? " < > |等字符,请重新输入有效文件名!";
                        return false;
                    }
                    if (!IsAllowedExtension(files[0]))
                    {
                        msg = "当前类型的文件不允许上传!";
                        return false;
                    }
    
    
                    if (!Directory.Exists(uploadpath))
                    {
                        Directory.CreateDirectory(uploadpath);
                    }
                    uploadpath = Path.Combine(uploadpath, fileName);
                    if (File.Exists(uploadpath))
                    {
                        msg = fileName + "文件已存在!";
                        return false;
                    }
                    files[0].SaveAs(uploadpath);
                    if (!isAbsolutePath)
                    {
                        uploadpath = ToRelativePath(uploadpath);
                    }
                    uploadinfo = "{"paht":"" + uploadpath.Replace("\", "\\") + "","fileName":"" + fileName + ""}";
                }
                return true;
            }
    
            /// <summary>
            /// 复制到公共云盘
            /// </summary>
            /// <param name="url"></param>
            /// <returns></returns>
            public static string CopyToPublicCloud(string url)
            {
                url = ToPhysicsPath(url);
                string fileName = Path.GetFileName(url);
                string toPath = Path.Combine(publicDiskBasePath, DateTime.Now.ToString("yyyy-MM-dd"));
                if (!System.IO.Directory.Exists(toPath))
                {
                    System.IO.Directory.CreateDirectory(toPath);
                }
                toPath = Path.Combine(toPath, fileName);
                File.Copy(url, toPath, false);
                string extension = Path.GetExtension(toPath);
                if (IsVideo(extension.Replace(".", "")) && extension != ".mp4")
                {
                    //将视频转码加入队列
                    DiskTransCodQuenu.Add(toPath);
                }
                return ToRelativePath(toPath);
            }
    
    
            /// <summary>
            /// 文件下载
            /// </summary>
            /// <param name="fileName">文件名</param>
            /// <param name="url">文件地址</param>
            public static void DownFile(string fileName, string url)
            {
                try
                {
                    var response = HttpContext.Current.Response;
                    response.ContentType = "application/x-zip-compressed";
                    response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
                    response.TransmitFile(url);
                }
                catch (Exception)
                {
                }
    
            }
    
            /// <summary>
            /// 批量下载
            /// </summary>
            /// <param name="urlList">文件路径List</param>
            public static void BatchDownFile(List<string> urlList, int userId)
            {
                /*删除之前的临时文件*/
                string path = Path.Combine(privateDiskBasePath, userId.ToString(), "tempZip");
                DirectoryInfo dirInfo = new DirectoryInfo(path);
                if (dirInfo.Exists)
                {
                    dirInfo.Delete(true);
                }
                dirInfo.Create();
                string fileName = Path.Combine(path, "打包文件.zip");
                using (ZipFile zip = ZipFile.Create(fileName))
                {
                    zip.BeginUpdate();
                    zip.SetComment("压缩包");
    
                    foreach (var item in urlList)
                    {
                        string phtPath = ToPhysicsPath(item);
                        if (File.Exists(phtPath))//判断文件是否存在
                        {
                            StaticDiskDataSource dataSource = new StaticDiskDataSource(phtPath);
                            string[] fileNameSplit = phtPath.Split('\');
                            zip.Add(dataSource, fileNameSplit[fileNameSplit.Length - 1]);
                        }
                    }
                    zip.CommitUpdate();
                }
                DownFile("打包文件.zip", fileName);
            }
    
            public static void DelFile(string url)
            {
                if (!string.IsNullOrWhiteSpace(url))
                {
                    url = ToPhysicsPath(url);
                    if (File.Exists(url))
                    {
                        File.Delete(url);
                    }
                }
            }
    
            public static bool FileIsExist(string url)
            {
                if (!string.IsNullOrWhiteSpace(url))
                {
                    url = ToPhysicsPath(url);
                    if (File.Exists(url))
                    {
                        return true;
                    }
                }
                return false;
            }
    
            public static string MoveFile(string fromUrl, string toFolderPath)
            {
                toFolderPath = ToPhysicsPath(toFolderPath);
                fromUrl = ToPhysicsPath(fromUrl);
                string toPath = Path.Combine(toFolderPath, Path.GetFileName(fromUrl));
                File.Move(fromUrl, toPath);
                string extension = Path.GetExtension(toPath);
                if (IsVideo(extension.Replace(".", "")) && extension != ".mp4")
                {
                    //将视频转码加入队列
                    DiskTransCodQuenu.Add(toPath);
                }
                return ToRelativePath(toPath);
            }
    
            /// <summary>
            /// 文件上传
            /// </summary>
            /// <param name="userId"></param>
            /// <param name="diskFile"></param>
            /// <param name="folderName"></param>
            /// <param name="msg"></param>
            /// <returns></returns>
            public static int Upload(int userId, w_disk_file diskFile, string folderName, ref string msg)
            {
                int fileId = 0;
                bool isSuc = UploadFile(folderName, userId, ref diskFile, ref msg);
                if (isSuc)
                {
                    w_disk_fileBLL bll = new w_disk_fileBLL();
                    string userName = GetLoginUserName();
                    if (!diskFile.isPublic)
                    {
                        diskFile.ownUserId = userId;
                        diskFile.author = userName;
                    }
                    diskFile.createrName = userName;
                    fileId = bll.Add(diskFile);
                }
                return fileId;
            }
    
            private static string RenameFileName(string fileName)
            {
                int userId = GetLoginUserId();
                w_data_userInfoBLL userBLL = new w_data_userInfoBLL();
                w_data_userInfo userInfo = userBLL.GetModel(userId);
                string extension = Path.GetExtension(fileName);
                Random rd = new Random();
                return string.Format("{0}{1}{2}{3}{4}", DateTime.Now.ToString("yyyy"),
                     userInfo.userNumber, DateTime.Now.ToString("MMddHHmmss"), rd.Next(1000, 9999), extension);
            }
    
            private static bool IsFileNameValid(string name)
            {
                bool isFilename = true;
                string[] errorStr = new string[] { "/", "\", ":", ",", "*", "?", """, "<", ">", "|" };
    
                int portCount = name.Count(c => c == '.');
                if (portCount > 1)//文件名不能出现两个.
                {
                    isFilename = false;
                }
    
                if (string.IsNullOrEmpty(name))
                {
                    isFilename = false;
                }
                else
                {
                    for (int i = 0; i < errorStr.Length; i++)
                    {
                        if (name.Contains(errorStr[i]))
                        {
                            isFilename = false;
                            break;
                        }
                    }
                }
                return isFilename;
            }
    
            private static bool IsAllowedExtension(HttpPostedFile file)
            {
                return true;
            }
    
            private static bool IsVideo(HttpPostedFile file)
            {
                return IsVideo(Path.GetExtension(file.FileName).Replace(".", ""));
            }
    
            /// <summary>
            /// 是否是音频文件
            /// </summary>
            /// <param name="file"></param>
            /// <returns></returns>
            private static bool IsAudio(HttpPostedFile file)
            {
                bool isAudio = false;
                IList<string> formateList = new List<string> { 
                    ".wav",".mp3 ",".rma",".ra",".wma",".asf",".mid",".midi",".rmi",".xmi",".ogg"
                    ,".vqf",".tvq",".mod",".ape",".aiff",".au"
                   };
                string formate = Path.GetExtension(file.FileName).ToLower();
                if (formateList.Contains(formate))
                {
                    isAudio = true;
                }
                return isAudio;
            }
    
            public static bool IsVideo(string formate)
            {
                bool isVideo = false;
                IList<string> formateList = new List<string> { 
                   "avi","flv","mpg","mpeg","mpe","m1v","m2v","mpv2","mp2v","dat","ts","tp","tpr","pva","pss","mp4","m4v",
                    "m4p","m4b","3gp","3gpp","3g2","3gp2","ogg","mov","qt","amr","rm","ram","rmvb","rpm"};
                if (formateList.Contains(formate))
                {
                    isVideo = true;
                }
                return isVideo;
            }
    
            /// <summary>
            /// 将B转换为MB
            /// </summary>
            /// <param name="b"></param>
            /// <returns></returns>
            private static decimal GetMB(long b)
            {
                decimal size = (decimal)b;
                for (int i = 0; i < 2; i++)
                {
                    size /= 1024;
                }
                return size;
            }
    
            public static int GetLoginUserId()
            {
                var userId = Utils.GetCookie("userId");
                return userId != "" ? Convert.ToInt32(userId) : 0;
            }
    
            public static string GetLoginUserName()
            {
                string loginUserName = Utils.GetCookie("userName");
                return loginUserName;
            }
    
            /// <summary>
            /// 转换成相对路径
            /// </summary>
            /// <param name="url"></param>
            /// <returns></returns>
            public static string ToRelativePath(string url)
            {
                if (url.StartsWith("/") || url.StartsWith("~/"))
                {
                    return url;
                }
                string tmpRootDir = HttpContext.Current.Server.MapPath(System.Web.HttpContext.Current.Request.ApplicationPath.ToString());//获取程序根目录
                string relativeUrl = string.Empty;
                if (url.Contains(tmpRootDir))
                {
                    relativeUrl = url.Replace(tmpRootDir, ""); //转换成相对路径
                    relativeUrl = relativeUrl.Replace(@"", @"/");
                }
                return "/" + relativeUrl;
            }
    
            /// <summary>
            /// 转成物理路径
            /// </summary>
            /// <param name="url"></param>
            /// <returns></returns>
            public static string ToPhysicsPath(string url)
            {
                if (url.StartsWith("/") || url.StartsWith("~/"))
                {
                    if (HttpContext.Current != null)
                    {
                        return HttpContext.Current.Server.MapPath(url);
                    }
                    else
                    {
                        return System.Web.Hosting.HostingEnvironment.MapPath(url);
                    }
                }
                return url;
            }
    
            /// <summary>
            /// 转换成MP4格式
            /// </summary>
            /// <param name="fromFilePath"></param>
            /// <returns></returns>
            public static string ToMp4(string fromFilePath)
            {
                string ffmpeg = Path.Combine(System.Web.HttpRuntime.AppDomainAppPath, "ffmpeg\bin\ffmpeg.exe");//ffmpeg执行文件的路径
                int lastIndexPort = fromFilePath.LastIndexOf(".");
                string toPathFileName = fromFilePath.Substring(0, lastIndexPort) + ".mp4";
                if ((!System.IO.File.Exists(ffmpeg)))
                {
                    return string.Empty; ;
                }
                //转mp4格式
                string Command = " -i "" + fromFilePath + ""  -c:v libx264 -strict -2 "" + toPathFileName + """;
                using (System.Diagnostics.Process p = new System.Diagnostics.Process())
                {
                    p.StartInfo.FileName = ffmpeg;
                    p.StartInfo.Arguments = Command;
                    //p.StartInfo.WorkingDirectory = HttpContext.Current.Server.MapPath("~/temp/");
                    p.StartInfo.UseShellExecute = false;
                    p.StartInfo.RedirectStandardInput = true;
                    p.StartInfo.RedirectStandardOutput = true;
                    p.StartInfo.RedirectStandardError = true;
                    p.StartInfo.CreateNoWindow = false;
                    p.Start();
                    p.BeginErrorReadLine();
                    p.WaitForExit();
                    p.Dispose();
                    return toPathFileName;
                }
            }
        }
    }
  • 相关阅读:
    【LeetCode】543. 二叉树的直径
    红色的眼睛黑色的心
    WinForm
    Windows地址栏的妙用
    C#
    WPF
    配置Notepad++万能调试
    盗取连接你wifi的人的qq
    Windows去除开始菜单图标背景
    解决Windows下文件无法删除的问题
  • 原文地址:https://www.cnblogs.com/tangchun/p/7858225.html
Copyright © 2011-2022 走看看