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

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
} 

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

(0)

相关推荐

  • jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】

    本文实例讲述了jquery+ajax实现上传图片并显示上传进度功能.分享给大家供大家参考,具体如下: jquery上传文件用的formdata,上传进度条需要添加xhr的onprogress html代码如下: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatib

  • JavaScript实现图片上传并预览并提交ajax

    本文实例为大家分享了JavaScript实现图片上传并预览并提交ajax的具体代码,供大家参考,具体内容如下 图片上传并预览 HTML <div class="file-box"> <img id="preview" /> <input type="text" id="imgfield" class="txt" placeholder="预览"> &l

  • php+ajax实现异步上传文件或图片功能

    本文为大家分享了ajax异步上传文件或图片功能的具体代码,供大家参考,具体内容如下 //html代码 <form enctype="multipart/form-data" id="upForm"> <input type="file" name="file" ><br><br> <input type="button" value="提交&q

  • ajax实现上传图片保存到后台并读取的实例

    上传图片有两种方式: 1.fileReader  可以把图片解析成base64码的格式,简单粗暴 2.canvas  可以重新绘制一张图片,可以先把获取得到的图片的blob放进canvas里面,再生成宽高和透明度的图片,然后转成相应的类型传到后台,目前支持png和jpeg格式. 以上这篇ajax实现上传图片保存到后台并读取的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • thinkPHP利用ajax异步上传图片并显示、删除的示例

    近来学习tp5的过程中,项目中有个发帖功能,选择主题图片.如下: 利用原始的文件上传处理,虽然通过原始js语句能实时显示上传图片,但是这样的话会涉及很多兼容问题.使用ajax技术,实现选择性删除所选图片功能,并不会有兼容问题. 表单文件form: <form method="post" enctype="multipart/form-data"> <div style="margin: 20px 20px 20px 10px;"

  • Ajax实现图片上传并预览功能

    先给大家展示下效果图,大家感觉不错,请参考实现代码. 最近在使用ThinkPHP5开发项目中客户有一个需求是在图片上传时附带预览功能.虽然现在有很多的插件能实现,但是还是觉得自己写比较好.我们知道,图片上传需要一个input:file表单 <input type='file' name='pic'> 当我们点击表单的时候提示选择需要上传的图片.但是此需求我们分析一下,可以在点击图片的时候使用JS实现预览功能,并且楼主也是这样做的.代码如下: function getFileUrl(source

  • PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例

    本文实例讲述了PHP结合jquery ajax实现上传多张图片,并限制图片大小操作.分享给大家供大家参考,具体如下: php用jquery-ajax上传多张图片限制图片大小 /** * 上传图片,默认大小限制为3M * @param String $fileInputName * @param number $size */ public function processUpload($fileInputName,$size=3145728) { $result = array('status'

  • php+ajax+h5实现图片上传功能

    本文实例为大家分享了php实现ajax图片上传的具体代码,供大家参考,具体内容如下 html页面代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script type="text/javascript" src="__PUBLIC__

  • 基于Spring Boot利用 ajax实现上传图片功能

    效果如下: 1.启动类中加入 SpringBoot重写addResourceHandlers映射文件路径 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/imctemp-rainy/**").addResourceLocations("file:D:/E/"); } 设置静态资源路径 2.   表单

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

    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

  • java网络之基于UDP的聊天程序示例解析

    基于UDP的Socket通信 UDP协议不是一种基于稳定连接的协议,是一种面向数据报包的通信协议,不需要通信双方建立稳定的连接,也没有所谓服务端和客户的概念,数据报包在传输的时候不保证一定及时到达,也不能保证数据报包的到达顺序,但是UDP协议传输效率要远高于TCP/IP. 以下是一个基于UDP的简单的消息发送接收程序. 消息发送方 1.创建一个数据报的网络通道 DatagramSocket ds = new DatagramSocket(); 2.准备需要传输的数据 String msg = "

  • thinkPHP5框架实现基于ajax的分页功能示例

    本文实例讲述了thinkPHP5框架实现基于ajax的分页功能.分享给大家供大家参考,具体如下: 最近一个页面的选项卡又牵扯到ajax分页,所以研究了一下tp5的ajax分页使用方法 首先看一下tp5的分页功能介绍 参数 描述 list_rows 每页数量 page 当前页 path url路径 query url额外参数 fragment url锚点 var_page 分页变量 type 分页类名 $caseDetails = CaseDetails::where(['status'=>1])

  • ajax基本通用代码示例

    本文实例讲述了ajax基本通用代码.分享给大家供大家参考,具体如下: <html> <head> <script type="text/JavaScript"> var xmlhttp function loadXMLDoc(url) { // code for Mozilla, etc. if (window.XMLHttpRequest) { xmlhttp=new XMLHttpRequest() xmlhttp.onreadystatecha

  • springmvc+ajax+formdata上传图片代码实例

    最近工作涉及到了上传图片的情况,在网上看了很多,就着重学习了下.上传文件的方式有多种,这里对使用FormData的方式进行说明. 1.springmvc项目想要上传文件,需要使用multipart方式,所以在spring-mvc.xml配置文件中需要增加multipart相关配置,代码如下 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultip

  • Python greenlet和gevent使用代码示例解析

    greenlet示例 greenlet微线程,允许在线程中手动切换 示例1,线程切换 from greenlet import greenlet def test1(x,y): z = gr2.switch(x+y) print(z) def test2(u): print(u) gr1.switch(42) gr1 = greenlet(test1) gr2 = greenlet(test2) gr1.switch("hello",'world') gr1和gr2是两个greenle

  • Jquery ajax书写方法代码实例解析

    Ajax在前端的应用极其广泛,因此,我们有必要对其进行总结,以方便后期的使用. AJAX优点: 可以异步请求服务器的数据,实现页面数据的实时动态加载, 在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容. jquery在全局对象jquery(也就是$)绑定了ajax()函数,可以处理Ajax请求,ajax常用的配置选项有: async 是否异步执行,默认为True,千万不要指定为False method 发送的Method,缺省为"GET",可指定为'POST','P

  • Spring纯注解配置实现代码示例解析

    问题 我们发现,之所以我们现在离不开 xml 配置文件,是因为我们有一句很关键的配置: <!-- 告知spring框架在,读取配置文件,创建容器时,扫描注解,依据注解创建对象,并存入容器中 --> <context:component-scan base-package="com.itheima"></context:component-scan> 如果他要也能用注解配置,那么我们就离脱离 xml 文件又进了一步. 另外,数据源和 JdbcTempl

  • PHP中的多种加密技术及代码示例解析

    对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法.有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以 从加密密钥中推算出来.而在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法. 信息加密技术的分类 单项散列加密技术(不可逆的加密) 属于摘要算法,不是一种加密算法,作用是把任意长的输入字符串变化成固定长的输出串的一种函数 MD5 string md5 ( string $str [, bool $raw_outp

  • 基于java实现斗地主代码实例解析

    斗地主 规则: 1. 组装54张扑克牌 2. 将54张牌顺序打乱 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌. 4. 查看三人各自手中的牌(按照牌的大小排序).底牌 手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5, 4,3 分析: 准备牌: 完成数字与纸牌的映射关系: 使用双列Map(HashMap)集合,完成一个数字与字符串纸牌的对应关系(相当于一个字典). 洗牌: 通过数字完成洗牌发牌 发牌: 将每个人以及底牌设计为Array

随机推荐