ajax图片上传,图片异步上传,更新实例

最近在研究ajax图片上传,图片异步上传,更新,留作参考。

直接上源码吧:

js源码:

/// <reference path="jquery-1.8.3.js" />
/// <reference path="ajaxForm/jquery.form.js" /> 

/*!
 * jQuery upload
 * 用于上传单个文件,上传成功后,返回文件路径。
 * 本插件依赖jQuery,jquery.form 请在使用时引入依赖的文件
 *
 * Date: 2014/4/23
 */
/*
<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插件ajaxFileUpload异步上传文件

    ajaxFileUpload.js 很多同名的,因为做出来一个很容易. 我用的是这个:https://github.com/carlcarl/AjaxFileUpload 下载地址在这里:http://xiazai.jb51.net/201610/yuanma/ajaxfileupload(jb51.net).rar AjaxFileUpload.js并不是一个很出名的插件,只是别人写好的放出来供大家用,原理都是创建隐藏的表单和iframe然后用JS去提交,获得返回值. 当初做了个异步上传的功能

  • jQuery异步上传文件插件ajaxFileUpload详细介绍

    一.ajaxFileUpload是一个异步上传文件的jQuery插件. 传一个不知道什么版本的上来,以后不用到处找了. 语法:$.ajaxFileUpload([options]) options参数说明: 1.url   上传处理程序地址. 2,fileElementId   需要上传的文件域的ID,即<input type="file">的ID. 3,secureuri 是否启用安全提交,默认为false. 4,dataType 服务器返回的数据类型.可以为xml,sc

  • jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码

    (jsp需要引入 :jquery-1.9.0.js.jquery.form.js ) ,jsp页面使用的是bootstrap制作的,看不懂的标签不用管,form表单大同小异.代码比较简陋,只是为了演示使用ajaxSubmit异步上传图片及保存数据,请海含! (参考文献:http://www.jb51.net/shouce/jquery/jquery_api/Plugins/Form/ajaxSubmit.html) 一:web (add.jsp) 复制代码 代码如下: <%@page impor

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

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

  • jquery之ajaxfileupload异步上传插件(附工程代码)

    点我下载工程代码 由于项目需求,在处理文件上传时需要使用到文件的异步上传.这里使用Jquery Ajax File Uploader这个组件下载地址:http://www.phpletter.com/download_project_version.php?version_id=6 服务器端采用struts2来处理文件上传. 所需环境: jquery.js ajaxfileupload.js struts2所依赖的jar包 及struts2-json-plugin-2.1.8.1.jar 编写文

  • JQuery插件ajaxfileupload.js异步上传文件实例

    在服务器端做文件上传的过程中,如果使用web服务器短端的上传控件去上传文件的话,会导致页面刷新一次,这样对用户的体验就不是很友好了.ajaxfileupload.js是一款jQuery的异步上传文件插件,使用简单且容易上手. 前置条件:ajaxfileupload.js文件,百度下载一个就行. JS引用: 复制代码 代码如下: <script src="/Content/JQueryJS/jquery-2.1.1.js"></script> <script

  • asp.net+ajaxfileupload.js 实现文件异步上传代码分享

    由于代码很简单,这里就闲话不多说了,直接上代码,小伙伴们自己研读代码就明白了. 前台代码: 复制代码 代码如下: /*修改头像*/      //上传      function _sc() {          $(".ckfile").html("").css("color", "#535353");          $("#_userImgPath").val("");     

  • ajax 异步上传带进度条视频并提取缩略图

    最近在做一个集富媒体功能于一身的项目.需要上传视频.这里我希望做成异步上传,并且有进度条,响应有状态码,视频连接,缩略图. 服务端响应 { "thumbnail": "/slsxpt//upload/thumbnail/fdceefc.jpg", "success": true, "link": "/slsxpt//upload/video/fdceefc.mp" } 并且希望我的input file控件不

  • jQuery插件ajaxFileUpload实现异步上传文件效果

    ajaxFileUpload是一个异步上传文件的jQuery插件. 传一个不知道什么版本的上来,以后不用到处找了. 语法:$.ajaxFileUpload([options]) options参数说明: 1.url   上传处理程序地址. 2,fileElementId   需要上传的文件域的ID,即<input type="file">的ID. 3,secureuri 是否启用安全提交,默认为false. 4,dataType 服务器返回的数据类型.可以为xml,scri

  • PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例

    平时用的比较多的JQuery图片上传插件是Uploadify这个插件,效果很不错,但是由于手机不支持flash,所以不得不再找一个文件上传插件来用了.后来发现ajaxFileUpload这个插件挺不错,所以就用这个插件来做异步上传文件的效果.网上也有很多对ajaxFileUpload插件的使用的文章,不过我发现没有PHP版,所以这次服务器那边的处理就使用PHP语言来处理. 一.详解ajaxFileUpload插件的语法参数 原理:ajaxfileupload是通过监听iframe的onload方

随机推荐