【开源】1句代码搞定图片批量上传,无需什么代码功底【无语言界限】

简介: 开源地址:https://github.com/dunitian/LoTUploader WebUploader基础上的封装改善,一句代码全部实现(样式美化,实例JS优化(配置优化,样式调整,名称+大小显示,错误处理等),后端代码。

开源地址:https://github.com/dunitian/LoTUploader

WebUploader基础上的封装改善,一句代码全部实现(样式美化,实例JS优化(配置优化,样式调整,名称+大小显示,错误处理等),后端代码。。。。。)

 效果:(完整demo:https://github.com/dunitian/LoTUploader/tree/V1.0.1/Demo

一句代码:$.lotuploader('lot-uploader', '/Home/Upload'); //必填参数:ID,Server地址 (完整案例看Demo部分)

第一步:引入样式

<link href="Scripts/lotUploader/lotuploader1.0.1.min.css" rel="stylesheet" />

第二步:自己定义一个DIV(id名任意)

<div id="lot-uploader"></div>

第三步:引入脚本

<script src="http://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script>
<script src="Scripts/lotUploader/lotuploader1.0.1.min.js"></script>

代码部分:

<script type="text/javascript">

$.lotuploader({
  lotDocId: 'lot-uploader', //ID
  lotUrl: '/Home/Upload', //服务器Post地址
});

</script>

单文件处理:

$.lotuploader({
        lotDocId: 'lot-uploader',
        lotUrl: '服务器Post地址',
        oneFile: true,
        fileSize: 1024 * 1024 * 5,
        btnStr: '点我就上传默认展图',
        lotSuccessFunc: function (file,data) {
            //方法主体
        },
        lotErrorFunc: function (msg) {
            $('#lot-uploader').append('<div class="lot-temp" style="color:red">' + msg + '</div> ');
            setTimeout(function () {
                $('.lot-temp').remove();
            }, 2000);
        }
    });

后端实例代码:

/// <summary>
        /// 图片上传
        /// </summary>
        /// <returns></returns>
        public JsonResult Upload(HttpPostedFileBase file)
        {
            if (file == null) { return Json(new { status = false, msg = "图片提交失败" }); }
            if (file.ContentLength > 10485760) { return Json(new { status = false, msg = "文件10M以内" }); }
            string filterStr = ".gif,.jpg,.jpeg,.bmp,.png";
            string fileExt = Path.GetExtension(file.FileName).ToLower();
            if (!filterStr.Contains(fileExt)) { return Json(new { status = false, msg = "图片格式不对" }); }
            //防止黑客恶意绕过,从根本上判断下文件后缀
            if (!file.InputStream.CheckingExt())
            {
                //todo:一次危险记录
                return Json(new { status = false, msg = "图片格式不对" });
            }
            //todo: md5判断一下文件是否已经上传过,如果已经上传直接返回 return Json(new { status = true, msg = sqlPath });

            string path = string.Format("{0}/{1}", "/lotFiles", DateTime.Now.ToString("yyyy-MM-dd"));
            string fileName = string.Format("{0}{1}", Guid.NewGuid().ToString("N"), fileExt);
            string sqlPath = string.Format("{0}/{1}", path, fileName);
            string dirPath = Request.MapPath(path);

            if (!Directory.Exists(dirPath)) { Directory.CreateDirectory(dirPath); }
            try
            {
                //todo:缩略图
                file.SaveAs(Path.Combine(dirPath, fileName));
                //todo: 未来写存数据库的Code
            }
            catch { return Json(new { status = false, msg = "图片保存失败" }); }
            return Json(new { status = true, msg = sqlPath });
        }
/// <summary>
    /// 判断扩展名是否是指定类型---默认是判断图片格式,符合返回true(没有释放stream,请手动:file.InputStream.Dispose();)
    /// eg:图片+压缩+文档:"7173", "255216", "6677", "13780", "8297", "55122", "8075", "208207"
    /// eg:img,"7173", "255216", "6677", "13780" //gif  //jpg  //bmp //png
    /// eg:file,"8297", "55122", "8075", "208207" //rar //7z //zip + 文档系列
    /// </summary>
    /// <param name="stream">文件流</param>
    /// <param name="fileTypes">文件扩展名</param>
    /// <returns></returns>
    public static bool CheckingExt(this Stream stream, params string[] fileTypes)
    {
        if (fileTypes == null || fileTypes.Length == 0) { fileTypes = new string[] { "7173", "255216", "6677", "13780" }; }
        bool result = false;
        string fileclass = "";

        #region 读取头两个字节
        var reader = new BinaryReader(stream);
        byte[] buff = new byte[2];
        try
        {
            reader.Read(buff, 0, 2);//读取每个文件的头两个字节
            fileclass = buff[0].ToString() + buff[1].ToString();
        }
        catch (System.Exception ex) { stream.Dispose(); reader.Dispose(); return false; }
        #endregion

        #region 校验
        for (int i = 0; i < fileTypes.Length; i++)
        {
            if (fileclass == fileTypes[i])
            {
                result = true;
                break;
            }
        }
        #endregion
        return result;
    }

 

注意点:

如果你项目并不使用font-awesome,那请吧.upload-state-done:after样式修改一下,这样成功后就很明了

案例没有采用纯Net语法,只是把服务端处理用Net处理了下。index.html部分通用



CDN地址:

https://cdn.rawgit.com/dunitian/LoTUploader/master/Dist/progress.png

https://cdn.rawgit.com/dunitian/LoTUploader/master/Dist/lotuploader.swf

https://cdn.rawgit.com/dunitian/LoTUploader/master/Dist/lotuploader.min.css

https://cdn.rawgit.com/dunitian/LoTUploader/master/Dist/lotuploader1.0.2.min.js

 




作者: 毒逆天
打赏: 18i4JpL6g54yAPAefdtgqwRrZ43YJwAV5z
本文版权归作者和博客园共有。欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接!
相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
2017计科01-08编译原理练习题一运行时空间组织管理&优化&目标代码生成
2017计科01-08编译原理练习题一运行时空间组织管理&优化&目标代码生成
2017计科01-08编译原理练习题一运行时空间组织管理&优化&目标代码生成
|
1月前
|
自然语言处理 关系型数据库 MySQL
PHP编程入门:构建你的第一个网页应用
【10月更文挑战第29天】本文旨在引导初学者步入PHP编程的世界,通过深入浅出的方式介绍PHP的基础知识,并指导读者如何动手实践,搭建一个简单的网页应用。文章不仅涉及PHP代码的编写,还包括了环境配置、项目结构设计以及前后端交互的基本概念。适合对Web开发感兴趣且希望快速入门的朋友阅读。
43 0
|
6月前
|
机器学习/深度学习 算法 计算机视觉
完全让ChatGPT写一个风格迁移的例子,不改动任何代码
完全让ChatGPT写一个风格迁移的例子,不改动任何代码
54 1
|
7月前
|
前端开发 算法 JavaScript
【新手解答3】深入探索 C 语言:头文件提供必要的接口、源文件保持实现细节的私有性 + 进一步学习的方向 + 如何快速编写程序并最终能制作小游戏
【新手解答3】深入探索 C 语言:头文件提供必要的接口、源文件保持实现细节的私有性 + 进一步学习的方向 + 如何快速编写程序并最终能制作小游戏
136 0
|
数据安全/隐私保护
谈一谈|文档加水印的常见做法
谈一谈|文档加水印的常见做法
128 1
|
设计模式 移动开发 前端开发
😲Review 实战经典:2 种封装风格,你偏爱哪种?
所以大家在后台管理系统项目中遇到的很多问题也都是相似的,代码很值得 review,本篇带来一例(真实)
编程基本功:典型的柳氏风格命名一例
编程基本功:典型的柳氏风格命名一例
75 0
编程基本功:典型的柳氏风格命名一例
工作中需要牢记的基础知识点:直接在word粘贴的自己的笔记,后期转为文字细化
工作中需要牢记的基础知识点:直接在word粘贴的自己的笔记,后期转为文字细化
86 0
工作中需要牢记的基础知识点:直接在word粘贴的自己的笔记,后期转为文字细化
|
算法
第七章 多用模板专注设计(上)
第七章 多用模板专注设计
104 0
第七章 多用模板专注设计(上)