基于ajax实现上传图片代码示例解析


Posted in Javascript onDecember 03, 2020

js源码:

/// <reference path="jquery-1.8.3.js" /> 
/// <reference path="ajaxForm/jquery.form.js" /> 
 
/*! 
 * jQuery upload 
 * 用于上传单个文件,上传成功后,返回文件路径。 
 * 本插件依赖jQuery,jquery.form 请在使用时引入依赖的文件 
 * 
 * Date: 2014/4/23 
 */ 
/* 
使用: 
html: 
<div style="width: 100%; float: left;"> 
  <input type="hidden" id="hfThumbnail" value="/uploads/2014/04/23/635338686611432716.jpg" /> 
  <div class="imgdiv"></div> 
  <span class="img_span"> 
    <input type="file" name="file" /> 
  </span> 
   
  <input type="button" value="上传" class="upload" /> 
</div> 
<div style="width: 100%; float: left;"> 
  <input type="hidden" id="hfThumbnail" value="/uploads/2014/04/23/635338686611432716.jpg" /> 
  <div class="imgdiv"></div> 
  <span class="img_span"> 
    <input type="file" name="file" /> 
  </span> 
   
  <input type="button" value="上传" class="upload" /> 
</div> 
 
js: 
 
$(document).ready(function () { 
     
  //$(".upload").upload({ 
  //  uploadData: { id: "12233" }, 
  //  successFn: function (response, statusText, xhr, $this) { 
  //    alert(response.Data.RelativePath) 
  //  }, 
  //  deleteData: { id: function () { return "asdfasdf" } } 
  //}); 
  
  $(".upload").upload({ 
    uploadData: { id: "12233" }, 
    successFn: "success",      //可以是字符串 
    deleteData: { id: function () { return "asdfasdf" } } 
  }); 
}); 
 
//上传成功后执行该函数 
function success(response, statusText, xhr, $this) { 
  //比如插入编辑器 
  alert(response.Data.RelativePath + $this.attr("value")) 
} 
*/ 
 
(function ($) { 
  $.extend($.fn, { 
    upload: function (settings) { 
 
      var options = $.extend({ 
        fileType: "gif|jpg|jpeg|png|bmp",            //允许的文件格式 
        uploadUrl: "/ajax/handler.ashx?action=uploadfile",   //上传URL地址 
        deleteUrl: "/ajax/handler.ashx?action=deletefile",   //删除URL地址 
        width: "",                       //图片显示的宽度 
        height: 100,                      //图片显示的高度 
        imgSelector: ".imgdiv",                 //图片选择器 
        uploadData: {},                     //上传时需要附加的参数 
        deleteData: {},                     //删除时需要附加的参数 
        deleteFn: function ($parent, showMessage) {       //删除图片的方法(默认方法使用POST提交) 
          methods.deleteImage($parent, showMessage); 
        }, 
        beforeSubmitFn: "beforeUpload",             //上传前执行的方法 原型 beforeSubmit(arr, $form, options); 
        successFn: "uploadSuccess",               //上传成功后执行的方法 uploadSuccess(response, statusText, xhr, $this) 
        errorFn: "uploadError"                 //上传失败后执行的方法 
      }, settings); 
 
      //上传准备函数 
      var methods = { 
        //验证文件格式 
        checkFile: function (filename) { 
          var pos = filename.lastIndexOf("."); 
          var str = filename.substring(pos, filename.length); 
          var str1 = str.toLowerCase(); 
          if (typeof options.fileType !== 'string') { options.fileType = "gif|jpg|jpeg|png|bmp"; } 
          var re = new RegExp("\.(" + options.fileType + ")$"); 
          return re.test(str1); 
        }, 
        //创建表单 
        createForm: function () { 
          var $form = document.createElement("form"); 
          $form.action = options.uploadUrl; 
          $form.method = "post"; 
          $form.enctype = "multipart/form-data"; 
          $form.style.display = "none"; 
          //将表单加当document上, 
          document.body.appendChild($form); //创建表单后一定要加上这句否则得到的form不能上传。document后要加上body,否则火狐下不行。 
          return $($form); 
        }, 
        //创建图片 
        createImage: function () { 
          //不能用 new Image() 来创建图片,否则ie下不能改变img 的宽高 
          var img = $(document.createElement("img")); 
          img.attr({ "title": "双击图片可删除图片!" }); 
          if (options.width !== "") { 
            img.attr({ "width": options.width }); 
          } 
          if (options.height !== "") { 
            img.attr({ "height": options.height }); 
          } 
          return img; 
        }, 
        showImage: function (filePath, $parent) { 
          var $img = methods.createImage(); 
          $parent.find(options.imgSelector).find("img").remove(); 
          //要先append再给img赋值,否则在ie下不能缩小宽度。 
          $img.appendTo($parent.find(options.imgSelector)); 
          $img.attr("src", filePath); 
          this.bindDelete($parent); 
        }, 
        bindDelete: function ($parent) { 
          $parent.find(options.imgSelector).find("img").bind("dblclick", function () { 
            options.deleteFn($parent, true); 
          }); 
        }, 
        deleteImage: function ($parent, showMessage) { 
          var $fileInput = $parent.find("input:hidden"); 
          if ($fileInput.val() !== "") { 
 
            var data = $.extend(options.deleteData, { filePath: $fileInput.val(), t: Math.random() }); 
 
            $.post(options.deleteUrl, data, function (response) { 
 
              if (showMessage) { alert(response.MessageContent) } 
 
              if (response.MessageType == 1) { 
                $fileInput.val(""); 
                $parent.find(options.imgSelector).find("img").remove(); 
              } 
            }, "JSON"); 
          } 
        }, 
        onload: function ($parent) { 
          var hiddenInput = $parent.find("input:hidden"); 
          if (typeof hiddenInput !== "undefined" && hiddenInput.val() !== "") { 
            var img = methods.createImage(); 
            if ($parent.find(options.imgSelector).find("img").length > 0) { $parent.find(options.imgSelector).find("img").remove(); } 
            //要先append再给img赋值,否则在ie下不能缩小宽度。  
            img.appendTo($parent.find(options.imgSelector)); 
            img.attr("src", hiddenInput.val()); 
            methods.bindDelete($parent); 
          } 
        } 
      }; 
      //上传主函数 
      this.each(function () { 
        var $this = $(this); 
        methods.onload($this.parent()); 
        $this.bind("click", function () { 
          var $fileInput = $(this).parent().find("input:file"); 
          var fileBox = $fileInput.parent(); 
 
          if ($fileInput.val() === "") { 
            alert("请选择要上传的图片!"); 
            return false; 
          } 
          //验证图片 
          if (!methods.checkFile($fileInput.val())) { 
            alert("文件格式不正确,只能上传格式为:" + options.fileType + "的文件。"); 
            return false; 
          } 
          //若隐藏域中有图片,先删除图片 
          if ($fileInput.val() !== "") { 
            options.deleteFn($this.parent(), false); 
            //methods.deleteImage($this.parent(), false); 
          } 
 
          //创建表单 
          var $form = methods.createForm(); 
 
          //把上传控件附加到表单 
          $fileInput.appendTo($form); 
          fileBox.html("<img src=\"/admin/styles/images/loading.gif\" />  正在上传... "); 
          $this.attr("disabled", true); 
 
          //构建ajaxSubmit参数 
          var data = {}; 
          data.data = options.uploadData; 
          data.type = "POST"; 
          data.dataType = "JSON"; 
          //上传前 
          data.beforeSubmit = function (arr, $form, options) { 
 
            var beforeSubmitFn; 
            try { beforeSubmitFn = eval(options.beforeSubmitFn) } catch (err) { }; 
            if (beforeSubmitFn) { 
              var $result = beforeSubmitFn(arr, $form, options); 
              if (typeof ($result) == "boolean") 
                return $result; 
            } 
          }; 
          //上传失败 
          data.error = function (response, statusText, xhr, $form) { 
            var errorFn; 
            try { errorFn = eval(options.errorFn) } catch (err) { }; 
            if (errorFn) { 
              errorFn(response.responseText, statusText, xhr, $this); 
            } 
          }; 
          //上传成功 
          data.success = function (response, statusText, xhr, $form) { 
            //response = eval("(" + response + ")"); 
            if (response.MessageType == 1) { 
              methods.showImage(response.Data.RelativePath, $this.parent()); 
              $this.parent().find("input:hidden").val(response.Data.RelativePath); 
 
              var successFn; 
              try { successFn = eval(options.successFn) } catch (err) { }; 
              if (successFn) { 
                $.ajaxSetup({ cache: false });//这个不能少,否则ie下会提示下载 
                successFn(response, statusText, xhr, $this); 
              } 
 
 
            } else { 
              alert(response.MessageContent); 
            } 
            $this.attr("disabled", false); 
            fileBox.html("<input type=\"file\" name=\"file\" />"); 
            $form.remove(); 
          }; 
 
          try { 
            //开始ajax提交表单 
            $form.ajaxSubmit(data); 
          } catch (e) { 
            alert(e.message); 
          } 
        }); 
      }); 
    } 
  }); 
})(jQuery)

html代码:

<!DOCTYPE html> 
 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<script src="Scripts/jquery/jquery-1.8.3.js"></script> 
<script src="Scripts/jquery/ajaxForm/jquery.form.js"></script> 
<script src="Scripts/jquery/jquery.upload.js"></script> 
<title></title> 
</head> 
<body> 
<form id="form1" runat="server"> 
<div style="width: 100%; float: left;"> 
  <input type="hidden" id="hfThumbnail" value="/uploads/2014/04/23/635338686611432716.jpg" /> 
  <div class="imgdiv"></div> 
  <span class="img_span"> 
    <input type="file" name="file" /> 
  </span> 
    
  <input type="button" value="上传" class="upload" /> 
</div> 
<div style="width: 100%; float: left;"> 
  <input type="hidden" id="hfThumbnail" value="/uploads/2014/04/23/635338686611432716.jpg" /> 
  <div class="imgdiv"></div> 
  <span class="img_span"> 
    <input type="file" name="file" /> 
  </span> 
    
  <input type="button" value="上传" class="upload" /> 
</div> 
</form> 
<script type="text/javascript"> 
  $(document).ready(function () { 
    //$(".upload").upload({ 
    //  uploadData: { id: "12233" }, 
    //  successFn: function (response, statusText, xhr, $this) { 
    //    alert(response.Data.RelativePath) 
    //  }, 
    //  deleteData: { id: function () { return "asdfasdf" } } 
    //}); 
    $(".upload").upload({ 
      uploadData: { id: "12233" }, 
      successFn: "success", 
      deleteData: { id: function () { return "asdfasdf" } } 
    }); 
  }); 
 
  //上传成功后执行该函数 
  function success(response, statusText, xhr, $this) { 
    //比如插入编辑器 
    alert(response.Data.RelativePath + $this.attr("value")) 
  } 
</script> 
</body> 
</html>

服务器端使用一般处理程序:

public void ProcessRequest(HttpContext context) 
{ 
  context.Response.ContentType = "application/json"; 
  var action = context.Request.QueryString.Get<string>("action").ToLower(); 
  var response = new JsonResult(StatusMessageType.Error, "没有权限或无效请求。").ToJson(); 
  switch (action) 
  { 
 
    case "uploadfile": 
      if (context.Request.Files.Count > 0) 
        response = UploadFile(context.Request); 
      break; 
    case "deletefile": 
      response = DeleteFile(context.Request.Form); 
      break; 
    default: 
      break; 
  } 
  context.Response.Write(response); 
} 
/// <summary> 
///  
/// </summary> 
/// <param name="file"></param> 
/// <returns></returns> 
private string UploadFile(HttpRequest request) 
{ 
  if (request.Files.Count == 0) 
    return new JsonResult(StatusMessageType.Error, "没有可处理的数据。").ToJson(); 
  var id = request.Form.Get<string>("id", ""); 
 
  var file = request.Files[0]; 
  if (file == null || file.ContentLength <= 0 || string.IsNullOrEmpty(file.FileName)) 
    return new JsonResult(StatusMessageType.Error, "没有可处理的数据。").ToJson(); 
 
  //IStoreFile storeFile = null; 
 
  string[] datePaths = new string[] { "~/uploads/" }; 
  datePaths = datePaths.Union(DateTime.Now.ToString("yyyy-MM-dd").Split('-')).ToArray(); 
  var relativePath = storeProvider.JoinDirectory(datePaths); 
 
  var dirPath = HttpContext.Current.Server.MapPath(relativePath); 
 
  if (!System.IO.Directory.Exists(dirPath)) 
    System.IO.Directory.CreateDirectory(dirPath); 
 
  var fileName = GenerateFileName(Path.GetExtension(file.FileName)); 
 
  var filePath = Path.Combine(dirPath, fileName); 
  file.SaveAs(filePath); 
  return new JsonResult(StatusMessageType.Success, "上传成功。", new 
  { 
    RelativePath = WebUtility.ResolveUrl(Path.Combine(relativePath, fileName)), 
    Size = file.ContentLength, 
    Id = id, 
  }).ToJson(); 
} 
 
public string DeleteFile(NameValueCollection form) 
{ 
  var filePath = form.Get<string>("filePath", "").Trim(); 
  if (string.IsNullOrEmpty(filePath)) 
    return new JsonResult(StatusMessageType.Error, "无效提交。").ToJson(); 
 
  try 
  { 
    if (System.IO.File.Exists(HttpContext.Current.Server.MapPath(filePath))) 
    { 
      System.IO.File.Delete(HttpContext.Current.Server.MapPath(filePath)); 
      return new JsonResult(StatusMessageType.Success, "文件删除成功。").ToJson(); 
    } 
    else 
    { 
      return new JsonResult(StatusMessageType.Success, "找不到该文件。").ToJson(); 
    } 
  } 
  catch (Exception) 
  { 
    return new JsonResult(StatusMessageType.Hint, "发生错误。").ToJson(); 
  } 
} 
 
/// <summary> 
/// 生成随机文件名 
/// </summary> 
/// <returns></returns> 
private string GenerateFileName(string extension) 
{ 
  return DateTime.Now.Ticks.ToString() + extension; 
}

程序使用的是framework4.0,所以使用了一些扩展方法。

JsonTesult类代码:

[Serializable] 
public class JsonResult 
{ 
  private StatusMessageType _messageType; 
  private string _messageContent; 
 
 
  /// <summary> 
  ///  
  /// </summary> 
  /// <param name="messageType"></param> 
  /// <param name="messageContent"></param> 
  /// <param name="data"></param> 
  public JsonResult(StatusMessageType messageType, string messageContent, object data = null) 
  { 
    _messageType = messageType; 
    _messageContent = messageContent; 
    Data = data; 
  } 
 
  public StatusMessageType MessageType 
  { 
    get { return _messageType; } 
    set { _messageType = value; } 
  } 
 
  public string MessageContent 
  { 
    get { return _messageContent; } 
    set { _messageContent = value; } 
  } 
 
  public object Data { get; set; } 
 
  public string ToJson() 
  { 
    JavaScriptSerializer serializer = new JavaScriptSerializer(); 
    var json = serializer.Serialize(this); 
 
    //string p = @"\\/Date(\d+)\\/"; 
    //MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString); 
    //Regex reg = new Regex(p); 
    //json = reg.Replace(json, matchEvaluator); 
    return json; 
  } 
 
  private static string ConvertJsonDateToDateString(Match m) 
  { 
    string result = string.Empty; 
    DateTime dt = new DateTime(1970, 1, 1); 
    dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value)); 
    dt = dt.ToLocalTime(); 
    result = dt.ToString("d"); 
    return result; 
  } 
}

StatusMessageType枚举类:

/// <summary> 
/// 提示消息类别 
/// </summary> 
public enum StatusMessageType 
{ 
  /// <summary> 
  /// 权限不足 
  /// </summary> 
  NoAccess = -2, 
  /// <summary> 
  /// 错误 
  /// </summary> 
  Error = -1, 
  /// <summary> 
  /// 成功 
  /// </summary> 
  Success = 1, 
 
  /// <summary> 
  /// 提示信息 
  /// </summary> 
  Hint = 0 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery通过a标签删除table中的一行的代码
Dec 02 Javascript
浅析JavaScript中的隐式类型转换
Dec 05 Javascript
jquery ajax jsonp跨域调用实例代码
Dec 11 Javascript
JavaScript检查弹出窗口是否被阻拦的方法技巧
Mar 13 Javascript
Vuejs第十篇之vuejs父子组件通信
Sep 06 Javascript
详解vue 中使用 AJAX获取数据的方法
Jan 18 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
Jul 31 Javascript
使用react实现手机号的数据同步显示功能的示例代码
Apr 03 Javascript
JavaScript生成指定范围随机数和随机序列的方法
May 05 Javascript
基于vue实现移动端圆形旋钮插件效果
Nov 28 Javascript
深入了解Vue动态组件和异步组件
Jan 26 Vue.js
JS函数式编程实现XDM一
Jun 16 Javascript
JQuery绑定事件四种实现方法解析
Dec 02 #jQuery
WebPack工具运行原理及入门教程
Dec 02 #Javascript
Vue router安装及使用方法解析
Dec 02 #Vue.js
js前端对于大量数据的展示方式及处理方法
Dec 02 #Javascript
vue3.0中setup使用(两种用法)
Dec 02 #Vue.js
JavaScript 如何在浏览器中使用摄像头
Dec 02 #Javascript
vue3.0+vue-router+element-plus初实践
Dec 02 #Vue.js
You might like
Laravel 自动生成验证的实例讲解:login / logout
2019/10/14 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
JS 实现完美include载入实现代码
2010/08/05 Javascript
理解Javascript_10_对象模型
2010/10/16 Javascript
validator验证控件使用代码
2010/11/23 Javascript
input按钮的事件处理大全
2010/12/10 Javascript
使用jquery实现select添加实现后台权限添加的效果
2011/05/28 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
Ext中下拉列表ComboBox组件store数据格式用法介绍
2013/07/15 Javascript
JavaScript加强之自定义callback示例
2013/09/21 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
2013/12/05 Javascript
浅谈JavaScript正则表达式分组匹配
2015/04/10 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
2016/10/26 Javascript
Angularjs 事件指令详细整理
2017/07/27 Javascript
Vue.js仿微信聊天窗口展示组件功能
2017/08/11 Javascript
JavaScript函数中的this四种绑定形式
2017/08/15 Javascript
使用JavaScript实现一个小程序之99乘法表
2017/09/21 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
js实现动态添加上传文件页面
2018/10/22 Javascript
微信小程序地图绘制线段并且测量(实例代码)
2020/01/02 Javascript
用js实现放大镜效果
2020/10/28 Javascript
Python中的数学运算操作符使用进阶
2016/06/20 Python
python中关于for循环的碎碎念
2017/06/30 Python
python matplotlib中文显示参数设置解析
2017/12/15 Python
详解Python发送email的三种方式
2018/10/18 Python
python实现网站用户名密码自动登录功能
2019/08/09 Python
python实现邮件自动发送
2019/08/10 Python
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
将一个数的从第5位开始的7个数取出,其余位置0
2016/05/26 面试题
协议书与合同的区别
2014/04/18 职场文书
2014年内部审计工作总结
2014/12/09 职场文书
幼儿园开学温馨提示
2015/07/15 职场文书
污染环境建议书
2015/09/14 职场文书
浅谈MySQL之浅入深出页原理
2021/06/23 MySQL
《吸血鬼:避世 血猎》官宣4.27发售 系列首款大逃杀
2022/04/03 其他游戏
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android