继承前文: 图片上传_ajax上传之实际应用(附上Demo)
直接上源码吧:

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,$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,$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,options) {

                        var beforeSubmitFn;
                        try { beforeSubmitFn = eval(options.beforeSubmitFn) } catch (err) { };
                        if (beforeSubmitFn) {
                            var $result = beforeSubmitFn(arr,options);
                            if (typeof ($result) == "boolean")
                                return $result;
                        }
                    };
                    //上传失败
                    data.error = function (response,$form) {
                        var errorFn;
                        try { errorFn = eval(options.errorFn) } catch (err) { };
                        if (errorFn) {
                            errorFn(response.responseText,$this);
                        }
                    };
                    //上传成功
                    data.success = function (response,$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,$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" },$this) {
        //        alert(response.Data.RelativePath)
        //    },//    deleteData: { id: function () { return "asdfasdf" } }
        //});
        $(".upload").upload({
            uploadData: { id: "12233" },deleteData: { id: function () { return "asdfasdf" } }
        });
    });

    //上传成功后执行该函数
    function success(response,$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
}
其他的扩展方法就不一一给出来了。

ajax图片上传,图片异步上传,更新的更多相关文章

  1. HTML5新增form控件和表单属性实例代码详解

    这篇文章主要介绍了HTML5新增form控件和表单属性实例代码详解,需要的朋友可以参考下

  2. 基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能

    这篇文章主要介绍了基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能,需要的朋友可以参考下

  3. HTML5表单验证特性(知识点小结)

    这篇文章主要介绍了HTML5表单验证特性的一些知识点,本文通过实例代码截图的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. amazeui页面分析之登录页面的示例代码

    这篇文章主要介绍了amazeui页面分析之登录页面的示例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 关于h5中的fetch方法解读(小结)

    这篇文章主要介绍了关于h5中的fetch方法解读(小结),fetch身为H5中的一个新对象,他的诞生,是为了取代ajax的存在而出现,有兴趣的可以了解一下

  6. ios – 使用NSURLSession获取JSON数据

    我试图从谷歌距离api使用NSURLSession获取数据,但如下所示,当我打印响应和数据时,我得到的结果为NULL.可能是什么问题?

  7. ios – 错误域= com.alamofire.error.serialization.response代码= -1011“请求失败:禁止

    任何人都可以帮我解决以下错误–>在AFNetworking2.5中使用“删除”方法时出错解决方法我发现,如果我的手机时钟不同步……它不允许我更新…也许检查你的手机设置到正确的时间“自动区”,看看是否有效…

  8. iOS网页/原生应用Facebook登录弹出 – 失败?

    如果我重新启动app/web-app,用户将自动登录,并重定向到成功页面.我认为是导致问题的原因当您在Firefox/Chrome/Safari浏览器中运行网页时,Facebook登录对话框会弹出一个弹出窗口或另一个选项卡.我相信这是这个弹出页面的一个问题,以及当成功登录时Javascript如何与自身通信.window.close的东西没有返回的根页面…失败的解决方法由于应用程序挂在前面提到的URL上,我决定在shouldStartLoadWithRequest(…)中添加if语句以强制UIWebvie

  9. ios – Watchkit新会话不起作用

    我的手表扩展中有两个视图控制器.每当我打电话时我只得到第一个视图控制器的响应,并在第二个viewcontroller中得到错误WCSession在app和watch扩展中启动.任何建议?

  10. 使用Firebase iOS Swift将特定设备的通知推送到特定设备

    我非常感谢PushNotifications的帮助.我的应用聊天,用户可以直接向对方发送短信.但是如果没有PushNotifications,它就没有多大意义.它全部设置在Firebase上.如何将推送通知从特定设备发送到特定设备?

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部