C# 结合LayUI 进行文件上传和图片上传

该代码实现了一个HttpUploadFile类,用于处理文件上传、文件类型检测和安全校验。类中包含多个方法,如GetFileRealType用于通过文件头信息识别文件类型,SaveHttpUploadFile系列方法用于保存上传文件,GetUploudWorkbook用于读取Excel文件。在文件上传后,会根据文件类型执行不同的安全策略,仅允许特定类型的文件通过。
摘要由CSDN通过智能技术生成

 1、方法处理类

namespace tools
{
    /// <summary>
    /// 文件类型
    /// 文件扩展名类型
    /// </summary>
    public enum FileType
    {
        /// <summary>
        /// 未知类型
        /// </summary>
        Unknown,
        /// <summary>
        /// JPG图片文件
        /// </summary>
        JPG = 255216,
        /// <summary>
        /// GIF图片文件
        /// </summary>
        GIF = 7173,
        /// <summary>
        /// BMP图片文件
        /// </summary>
        BMP = 6677,
        /// <summary>
        /// PNG图片文件
        /// </summary>
        PNG = 13780,
        /// <summary>
        /// EXE可执行文件
        /// </summary>
        EXE = 7790,
        /// <summary>
        /// RAR压缩文件
        /// </summary>
        RAR = 8297,
        /// <summary>
        /// ZIP压缩文件
        /// </summary>
        ZIP = 8075,
        /// <summary>
        /// XML文本文件
        /// </summary>
        XML = 6063,
        /// <summary>
        /// HTML超文本文件
        /// </summary>
        HTML = 6033,
        /// <summary>
        /// ASPX模版引擎文件
        /// </summary>
        ASPX = 239187,
        /// <summary>
        /// C#类文件
        /// </summary>
        CS = 117115,
        /// <summary>
        /// JS脚本文件
        /// </summary>
        JS = 119105,
        /// <summary>
        /// TXT文本文件
        /// </summary>
        TXT = 210187,
        /// <summary>
        /// SQL数据库脚本文件
        /// </summary>
        SQL = 255254,
        /// <summary>
        /// MP3文件
        /// </summary>
        MP3 = 7368,
        /// <summary>
        /// BAT文件
        /// </summary>
        BAT = 64101,
        /// <summary>
        /// BTSEED文件
        /// </summary>
        BTSEED = 10056,
        /// <summary>
        /// RDP文件
        /// </summary>
        RDP = 255254,
        /// <summary>
        /// PSD文件
        /// </summary>
        PSD = 5666,
        /// <summary>
        /// PDF文件
        /// </summary>
        PDF = 3780,
        /// <summary>
        /// CHM文件
        /// </summary>
        CHM = 7384,
        /// <summary>
        /// LOG文件
        /// </summary>
        LOG = 70105,
        /// <summary>
        /// REG文件
        /// </summary>
        REG = 8269,
        /// <summary>
        /// HLP文件
        /// </summary>
        HLP = 6395,
        /// <summary>
        /// XLS 文件
        /// </summary>
        XLS = 208207,
        /// <summary>
        /// DOC文件
        /// </summary>
        DOC = 208207,
        /// <summary>
        /// DOCX 文件
        /// </summary>
        DOCX = 8075,
        /// <summary>
        /// XLSX文件
        /// </summary>
        XLSX = 8075,
        /// <summary>
        /// PPTX文件
        /// </summary>
        PPTX = 8075,
        /// <summary>
        /// MMAP文件
        /// </summary>
        MMAP = 8075,
        /// <summary>
        /// CSV文件
        /// </summary>
        CSV = 4944,
        /// <summary>
        /// Outlook邮件
        /// </summary>
        MSG = 176161,
    }
    /// <summary>
    /// HttpUploadFile 的摘要说明
    /// </summary>
    public class HttpUploadFile
    {
        /// <summary>
        /// 获取指定文件路径的文件真实类型,返回获取的文件真实类型
        /// 未获取到数据则返回FileType.Unknown(未知类型)
        /// </summary>
        /// <param name="FilePath">文件路径</param>
        /// <returns>文件真实类型</returns>
        public static FileType GetFileRealType(string FilePath)
        {
            //处理错误参数
            if (String.IsNullOrEmpty(FilePath))
            {
                return FileType.Unknown;
            }
            else { }

            FileType result = FileType.Unknown;

            //获取文件真实类型的标识码
            string CodeString = null;

            string FileFullPath = Path.GetFullPath(FilePath);

            if (File.Exists(FileFullPath))
            {

                FileStream FileStrems = new FileStream(FileFullPath, FileMode.Open, FileAccess.Read);
                using (BinaryReader BinaryReaders = new BinaryReader(FileStrems))
                {
                    byte FileBuffer = BinaryReaders.ReadByte();
                    CodeString += FileBuffer.ToString();
                    FileBuffer = BinaryReaders.ReadByte();
                    CodeString += FileBuffer.ToString();
                }

                //获取文件真实类型
                int Code = Convert.ToInt32(CodeString);

                FileType FileRealType = (FileType)Enum.ToObject(typeof(FileType), Code);
                if (Enum.IsDefined(typeof(FileType), FileRealType))
                {
                    result = FileRealType;
                }
                else { }
            }
            else { }

            return result;
        }

        /// <summary>
        /// 上传文件,返回保存的文件路径
        /// </summary>
        /// <param name="SavePath">保存路径</param>
        /// <param name="FileName">保存文件名称</param>
        /// <param name="UploadName">上传文件集合名称</param>
        /// <returns></returns>
        public static string SaveHttpUploadFile(string SavePath, string RandTime, string UploadName, int size, out string FileName)
        {

            //处理错误参数
            if ((String.IsNullOrEmpty(SavePath)) || (String.IsNullOrEmpty(UploadName)) || (String.IsNullOrEmpty(RandTime)) || (false == Path.IsPathRooted(SavePath)) || (null == HttpContext.Current.Request.Files[UploadName]))
            {
                FileName = "";
                return null;
            }
            else { }

            string result = null;
            string FileNameNew = "";
            HttpPostedFile UploadFile = HttpContext.Current.Request.Files[UploadName];
            if (UploadFile.ContentLength > 0 && UploadFile.ContentLength < size)
            {
                //上传文件
                if (!Directory.Exists(SavePath))
                {
                    Directory.CreateDirectory(SavePath);
                }
                else { }
                string FileExtension = Path.GetExtension(UploadFile.FileName);
                string FileName_Old = Path.GetFileNameWithoutExtension(UploadFile.FileName);
                if (!String.IsNullOrEmpty(FileExtension))//判断文件名是否含有后缀
                {
                    FileNameNew = FileName_Old + RandTime + FileExtension;
                }
                else { }
                FileName = FileNameNew;
                string UploadPath = Path.Combine(SavePath, FileNameNew);
                if (!String.IsNullOrEmpty(UploadPath))
                {
                    UploadFile.SaveAs(UploadPath);
                    result = UploadPath;

                }
                else { }
            }
            else { }
            FileName = FileNameNew;
            return result;
        }

        /// <summary>
        /// 上传图片,返回保存的文件路径(不进行压缩)
        /// </summary>
        /// <param name="SavePath">保存路径</param>
        /// <param name="FileName">保存文件名称</param>
        /// <param name="UploadName">上传文件集合名称</param>
        /// <param name="size">文件大小</param>
        /// <returns></returns>
        public static string SaveHttpUploadImage(string SavePath, string FileName, string UploadName, int size)
        {
            //处理错误参数
            if ((String.IsNullOrEmpty(SavePath)) || (String.IsNullOrEmpty(UploadName)) || (String.IsNullOrEmpty(FileName)) || (false == Path.IsPathRooted(SavePath)) || (null == HttpContext.Current.Request.Files[UploadName]))
            {
                return null;
            }
            else { }

            string result = null;

            HttpPostedFile UploadFile = HttpContext.Current.Request.Files[UploadName];
            if (UploadFile.ContentLength > 0 && UploadFile.ContentLength < size)
            {
                //上传文件
                if (!Directory.Exists(SavePath))
                {
                    Directory.CreateDirectory(SavePath);
                }
                else { }
                string FileExtension = Path.GetExtension(UploadFile.FileName);
                if (!String.IsNullOrEmpty(FileExtension))//判断文件名是否含有后缀
                {
                    FileName += FileExtension;
                }
                else { }
                string UploadPath = Path.Combine(SavePath, FileName);
                if (!String.IsNullOrEmpty(UploadPath))
                {
                    UploadFile.SaveAs(UploadPath);

                    result = UploadPath;

                }
                else { }
            }
            else { }
            return result;
        }

        /// <summary>
        /// 上传图片,返回保存的文件路径(压缩版)
        /// </summary>
        /// <param name="SavePath">保存路径</param>
        /// <param name="FileName">保存文件名称</param>
        /// <param name="UploadName">上传文件集合名称</param>
        /// <param name="size">文件大小</param>
        /// <returns></returns>
        public static string SaveHttpUploadFile_Compress(string SavePath, string FileName, string UploadName, int size)
        {
            //处理错误参数
            if ((String.IsNullOrEmpty(SavePath)) || (String.IsNullOrEmpty(UploadName)) || (String.IsNullOrEmpty(FileName)) || (false == Path.IsPathRooted(SavePath)) || (null == HttpContext.Current.Request.Files[UploadName]))
            {
                return null;
            }
            else { }

            string result = null;

            HttpPostedFile UploadFile = HttpContext.Current.Request.Files[UploadName];
            //上传文件
            if (!Directory.Exists(SavePath))
            {
                Directory.CreateDirectory(SavePath);
            }
            else { }
            string FileExtension = Path.GetExtension(UploadFile.FileName);
            if (!String.IsNullOrEmpty(FileExtension))//判断文件名是否含有后缀
            {
                FileName += FileExtension;
            }
            else { }
            string UploadPath = Path.Combine(SavePath, FileName);
            string UploadSmailPath = Path.Combine(SavePath, FileName);
            if (!String.IsNullOrEmpty(UploadPath))
            {
                UploadFile.SaveAs(UploadPath);
                System.Drawing.Image iImage = GetReducedImage(285, 315, UploadPath);
                switch (tools.HttpUploadFile.GetFileRealType(UploadPath))
                {
                    case tools.FileType.BMP: iImage.Save(UploadSmailPath, System.Drawing.Imaging.ImageFormat.Bmp);
                        break;
                    case tools.FileType.GIF: iImage.Save(UploadSmailPath, System.Drawing.Imaging.ImageFormat.Gif);
                        break;
                    case tools.FileType.JPG: iImage.Save(UploadSmailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
                        break;
                    case tools.FileType.PNG: iImage.Save(UploadSmailPath, System.Drawing.Imaging.ImageFormat.Png);
                        break;
                }
                iImage.Dispose();
                result = UploadSmailPath;
            }
            else { }
            return result;
        }
        //返回缩略图的方法
        public static System.Drawing.Image GetReducedImage(int Width, int Height, string savePath)
        {
            System.Drawing.Image ResourceImage = System.Drawing.Image.FromFile(savePath);
            //用指定的大小和格式初始化Bitmap类的新实例
            Bitmap bitmap = new Bitmap(Width, Height, PixelFormat.Format32bppArgb);
            //从指定的Image对象创建新Graphics对象
            Graphics graphics = Graphics.FromImage(bitmap);
            //清除整个绘图面并以透明背景色填充
            graphics.Clear(Color.Transparent);
            //在指定位置并且按指定大小绘制原图片对象
            graphics.DrawImage(ResourceImage, new Rectangle(0, 0, Width, Height));
            ResourceImage.Dispose();
            return bitmap;

        }
        /// <summary>
        /// EXECl文件导入
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public IWorkbook GetUploudWorkbook(HttpContext context)
        {
            if (context.Request.Files.Count <= 0)
            {
                throw new Exception("请选择需要导入的文件!");
            }

            var file = context.Request.Files[0];
            string fileName = file.FileName;
            string[] fileNameArray = fileName.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);

            if (fileNameArray.Length < 2)
            {
                throw new Exception("请选择需要导入的文件!");
            }
            if (file.InputStream.Length <= 0)
            {
                throw new Exception("EXCEL文件读取失败,请重新上传!");
            }
            string fileEXTName = fileNameArray[fileNameArray.Length - 1];
            switch (fileEXTName)
            {
                case "xls":
                    return new NPOI.HSSF.UserModel.HSSFWorkbook(file.InputStream);
                case "xlsx":
                    return new NPOI.XSSF.UserModel.XSSFWorkbook(file.InputStream);
                default:
                    throw new Exception("文件格式不正确!");
            }
        }

    }
}

 2、进行调用

 //保存上传文件
        string FileName = "";//文件名称
        string RandTime = DateTime.Now.ToString("yyyyMMddhhmmssffff");
        string FilePath = "/Upload/";//上传路径
        string SavePath = context.Server.MapPath("" + FilePath);
        string UploadImagePath = tools.HttpUploadFile.SaveHttpUploadFile(SavePath, RandTime, "file", 5242880, out FileName);
        if (!String.IsNullOrEmpty(UploadImagePath))
        {
            //文件安全校验
            switch (tools.HttpUploadFile.GetFileRealType(UploadImagePath))
            {
                case tools.FileType.DOC:
                case tools.FileType.DOCX:
                case tools.FileType.PDF:
                case tools.FileType.JPG:
                case tools.FileType.PNG:
                case tools.FileType.RAR:
                case tools.FileType.MSG:
                    Message.Datas = (FilePath + FileName);
                    Message.count = 1;
                    Message.code = tools.ResultCodeType.Succeed;
                    Message.msg = "上传成功!";
                    break;
                default:
                    System.IO.File.Delete(UploadImagePath);
                    Message.code = tools.ResultCodeType.UnknownError;
                    Message.msg = "文件安全性未知,禁止上传!";
                    break;
            }
        }
        else { }
        context.Response.Write(Json.Serialize(Message));

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值