ajax上传文件的原理与实现

    ajax已经很普遍了,但使用 ajax上传文件自己却一直都没有涉及,我只知道挺复杂的,上传文件不同于上传一般的表单数据,必须特殊处理,知道一般ajax使用上传都是应用一个虚拟的iframe,但由于项目需要,在网上找了找,没想到找到了两个支持ajax上传文件的jquery插件,jquery.uploadify.js和dropzone.min.js两个都可以实现ajax上传文件,效果也不错。

1使用jquery.uploadify.js上传文件

 这种上传方式,使用了Flash,因此需要引用一个特殊的js文件swfobject.js,低版本的需要引用,高版本的这个文件已经包含在jquery.uploadify.js中了。另外低版本的参数和高版本的参数也不太一样了。

使用Uploadify v3.2.1的完整前台代码

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="Scripts/jquery-1.8.0.min.js" type="text/javascript"></script>
    <script src="Styles/jquery.uploadify.js" type="text/javascript"></script>
    <link href="Styles/uploadify.css" rel="stylesheet" type="text/css" />
     <script type="text/javascript">
         $(document).ready(function () {

             $("#uploadify").uploadify({
                 swf: 'Styles/uploadify.swf',
                 uploader: 'Handler1.ashx?OperationType=upfile',//后台的处理地址
                 fileTypeDesc: '请选择excel文件',
                 buttonText: '请选择excel文件',
                 fileTypeExts: '*.xls',
                 'auto': false,
                  onSelectError: function (file, errorCode, errorMsg) {
                     switch (errorCode) {
                         case -100:
                             alert("上传的文件数量已经超出系统限制的" + $('#uploadify').uploadify('settings', 'queueSizeLimit') + "个文件!");
                             break;
                         case -110:
                             alert("文件 [" + file.name + "] 大小超出系统限制的" + $('#uploadify').uploadify('settings', 'fileSizeLimit') + "大小!");
                             break;
                         case -120:
                             alert("文件 [" + file.name + "] 大小异常!");
                             break;
                         case -130:
                             alert("文件 [" + file.name + "] 类型不正确!");
                             break;
                     }
                 },
                 onFallback: function () {
                     alert("您未安装FLASH控件,无法上传图片!请安装FLASH控件后再试。");
                 },
                 //上传到服务器,服务器返回相应信息到data里
                 onUploadSuccess: function (file, data, response) {
                     alert(data);
                 },
                 onSelect: function (fileObj) {
                     alert("文件名:" + fileObj.name + "\r\n" +
                  "文件大小:" + fileObj.size + "\r\n" +
                  "创建时间:" + fileObj.creationdate + "\r\n" +
                  "最后修改时间:" + fileObj.modificationdate + "\r\n" +
                  "文件类型:" + fileObj.type
            );
                 }
             });
         });
         function doUplaod() {
             $('#uploadify').uploadify('upload', '*');
         }

         function closeLoad() {
             $('#uploadify').uploadify('cancel', '*');
         }
     </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
     <div>
     <div id="fileQueue"></div>
    <input type="file" name="uploadify" id="uploadify" />
    <p>
      <a href="javascript:doUplaod()">上传</a>|
      <a href="javascript:closeLoad()">取消上传</a>
    </p>
    </div>
    </div>
    </form>
</body>
</html>

Uploadify v2.1.0的写法

由于没有swfobject.js,需要添加引用

    <script src="Scripts/swfobject.js" type="text/javascript"></script>

另外部分参数也不一样,例如uploader,script

完整的前台代码

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="Scripts/jquery-1.8.0.min.js" type="text/javascript"></script>
    <script src="Scripts/jquery.uploadify.v2.1.0.js" type="text/javascript"></script>

    <link href="Scripts/uploadify.css" rel="stylesheet" type="text/css" />
    <script src="Scripts/swfobject.js" type="text/javascript"></script>
    <script type="text/javascript">

            </script>
            <script type="text/javascript">
                $(document).ready(function () {
                    $("#uploadify").uploadify({
                        'uploader': 'Scripts/uploadify1.swf',
                        'script': 'Handler1.ashx?OperationType=upfile',
                        'cancelImg': 'Scripts/cancel.png',
                        'folder': 'UploadFile',
                        'queueID': 'fileQueue',
                        'auto': false,
                        'multi': false,

                        'fileExt': '*.doc;*.xls',
                        'fileDesc': '请选择excel文件',
                        'onSelect': function (e, queueId, fileObj) {
                            alert("唯一标识:" + queueId + "\r\n" +
                  "文件名:" + fileObj.name + "\r\n" +
                  "文件大小:" + fileObj.size + "\r\n" +
                  "创建时间:" + fileObj.creationDate + "\r\n" +
                  "最后修改时间:" + fileObj.modificationDate + "\r\n" +
                  "文件类型:" + fileObj.type
            );
                        }
                    });
                });
            </script>

</head>
<body>
    <form id="form1" runat="server">
    <div>
     <div id="fileQueue"></div>
    <input type="file" name="uploadify" id="uploadify" />
    <p>
      <a href="javascript:$('#uploadify').uploadifyUpload()">上传</a>|
      <a href="javascript:$('#uploadify').uploadifyClearQueue()">取消上传</a>
    </p>
    </div>
    </form>
</body>
</html>

2使用dropzone.min.js上传文件

没有使用Flash,但对浏览器要求比较高,例如IE10以上才支持,应该是使用了html5的技术

完整的前端代码、

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="Scripts/jquery-1.8.0.min.js" type="text/javascript"></script>
    <script src="Scripts/dropzone.min.js" type="text/javascript"></script>
    <link href="Scripts/dropzone.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript">
        jQuery(function ($) {
            Dropzone.autoDiscover = false;
            try {
                var myDropzone = new Dropzone("#dropzone", {
                    paramName: "FileData", // The name that will be used to transfer the file
                    maxFilesize: 5, // MB
                    dictRemoveFile: '移除文件',
                    dictCancelUpload: '取消上传',
                    addRemoveLinks: true,
                    uploadMultiple: false,
                    acceptedFiles: '.xls',
                    autoProcessQueue: true,
                    dictRemoveFile: "关闭",
                    dictFileTooBig: '此文件过大',
                    dictCancelUploadConfirmation: '确定取消上传吗?',
                    dictInvalidInputType: "不支持此类型文件上传!",
                    parallelUploads: 1, //限制上传文件数
                    url: "Handler1.ashx?OperationType=upfile",
                    init: function () {
                        this.on("success", function (file) {
                            //console.log("File " + file.name + "uploaded");
                            alert("文件" + file.name + "上传成功");
                        });
                        this.on("complete", function (file) {
                            this.removeFile(file);
                        });
                        this.on("removedfile", function (file) {
                            //alert(file.name);
                        });
                    },
                  /*  accept: function (file, done) {
                        //if (file.name == "11.jpg") {
                        //    done("Naha, you don't.");
                        //}
                        //else {
                        done();
                    },*/
                    success: function (file, data) {
                        if (data.status === 1) {
                            $scope.uploadImage = data.message;
                            $scope.listUserImages();
                        } else {
                            //alertService.showAlert({
                            //    content: data.message,
                            //    type: 'warning'
                            //});
                            //$('.dz-error-mark').show();
                            //alert(data.message);
                        }
                    },
                    dictDefaultMessage:
                    '<span class="bigger-150 bolder"><i class="ace-icon fa fa-caret-right red"></i> 上传</span> 文件 \<span class="smaller-80 grey">点击</span> <br /> \<i class="upload-icon ace-icon fa fa-cloud-upload blue fa-3x"></i>',
                    dictResponseError: 'Error while uploading file!',
                    //change the previewTemplate to use Bootstrap progress bars
                    previewTemplate: "<div class=\"dz-preview dz-file-preview\">\n  <div class=\"dz-details\">\n    <div class=\"dz-filename\"><span data-dz-name></span></div>\n    <div class=\"dz-size\" data-dz-size></div>\n    <img data-dz-thumbnail />\n  </div>\n  <div class=\"progress progress-small progress-striped active\"><div class=\"progress-bar progress-bar-success\" data-dz-uploadprogress></div></div>\n  <div class=\"dz-success-mark\"><span></span></div>\n  <div class=\"dz-error-mark\"><span></span></div>\n  <div class=\"dz-error-message\"><span data-dz-errormessage></span></div>\n</div>"
                });
            } catch (e) {
                alert('Dropzone.js does not support older browsers!');
            }
        });
    </script>
</head>
<body>
    <form id="dropzone" runat="server" action="Handler1.ashx?OperationType=upfile" class="dropzone dz-clickable"  enctype="multipart/form-data" method="post">
     <div class="dz-message" style="width:50px;height:50px;">
      <i class="upload-icon ace-icon fa fa-cloud-upload blue fa-3x"></i>
        </div>
    <div>

<div id="FileBed"></div>点击上传文件
  <input type="file" multiple="multiple" class="dz-hidden-input" style="visibility: hidden; position: absolute; top: 0px; left: 0px; height: 0px; width: 0px;" />
    </div>
    </form>

</body>
</html>

3后台处理代码

 public class Handler1 : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
             string operatype = context.Request.QueryString["OperationType"];
             if (operatype == "upfile")
             {
                 HttpPostedFile file = context.Request.Files["FileData"];
                 if (file != null)
                 {
                     string fullPath = System.IO.Path.Combine(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "update"), DateTime.Now.Date.ToString("yyyyMMdd"));
                     file.SaveAs(fullPath + file.FileName);
                 }
             }
            context.Response.ContentType = "text/plain";
            context.Response.Write("上传成功");
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

源代码下载

时间: 2024-10-10 07:58:13

ajax上传文件的原理与实现的相关文章

atitit.ajax上传文件的实现原理 与设计

atitit.ajax上传文件的实现原理 与设计 1. 上传文件的三大难题 1 1.1. 本地预览 1 1.2. 无刷新 1 1.3. 进度显示 1 2.  传统的html4  + ajax 是无法直接实现上传文件 1 2.1. 传统的实现方式iframe 2 2.2. html5转码base64 3 2.3. 其它插件FLASH的实现原理 3 3. 上传进度的实现原理 3 3.1. 使用ajax结合服务端的进度返回,比較麻烦 4 4. 本地预览的解决 4 4.1. 用HTML5上传文件 4 5

express 如何上传文件的原理和实现

express 上传文件的原理和实现 原理 formidable multer COS 1.原理 1.1 要想了解express上传 我们先看看 nodejs原生上传是怎么实现的 let server = require('http').Server(app); server.listen(3000); 首先为了让express拥有原始http模块的一些功能 请不要使用 bodyParser 之类的中间件 因为不会next到这里 保持尽量原生. app.post('/upload', async

使用ajax上传文件

有时候我们需要在web端向服务器上传文件,以前是使用form的方式进行提交,html5中支持直接使用xmlhttprequest上传文件,send对象支持blob对象而文件就是一个blob对象 ajax上传文件 ajax中可以通过参数processData这个参数来控制data是否进行转换,我们将这个参数设置为false就可以使用ajax进行文件的上传操作了 example: $.ajax({ url: "your url", type: "POST", proce

Web上传文件的原理及实现

现在有很多Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于java的Commons FileUpload.还有Struts1.x和Struts2中带的上传文件功能(实际上,Struts2在底层也使用了Commons FileUpload). 虽然现在有很多上传组件可以利用,但是了解Web上传文件的原理,对于处理突然出现的问题会有很大的帮助,下面就来讲一下通过浏览器上传文件的基本原理.在了解了原理之后,就可以非常容易地自制满足自身需要的上传组件了. 众所周知,在客户端代码中需要使用<

闲话ajax,例ajax轮询,ajax上传文件

引语:ajax这门技术早已见怪不怪了,我本人也只是就自己真实的经验去总结一些不足道的话.供不是特别了解的朋友参考参考! 本来早就想写一篇关于ajax的文章的,但是前段时间一直很忙,就搁置了,趁着元旦放假,赶紧补上吧! ajax的出现,可以出给用户带来了很好的体验,证据如下: 1.感觉:以前要给用户呈现新的内容,就必须要刷新当前页面,结果往往是这样:用户看着看着,唰...,然后又重头看起,我那个去,这谁受得了; 自从有了ajax后,就是这样的,用户关注哪一块,变化哪一块,我们就更新那一块,完全看不

ajax上传文件

以往我用的上传文件都是Flex写的,最近html页面需要上传页面功能. 相比之下,比flex还是要麻烦一些,问题也多一些.这里记录下: ajax上传文件,我用到了ajaxfileupload.js修正版. <form id="addAttaForm" enctype="multipart/form-data"> <div class="row"> <label for="fileUpload"&g

【原创】AJAX上传文件,formdata表单提交问题

今天遇到一个特别神奇的问题,AJAX上传文件,formdata表单提交问题,后台显示无法获取上传文件. 排查许久发现是formdata.append();时,要先添加file,而后添加其他参数.方可正常工作. 可是却不知到底是和原因.去了火狐开发者社区也未能找到答案. 还望知道的大神赐教一二.

[转]文件上传原理:Web上传文件的原理及实现

现在有很多Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于java的CommonsFileUpload.还有Struts1.x和Struts2中带的上传文件功能(实际上,Struts2在底层也使用了CommonsFileUpload).在asp.net中也有相应的上传文件的控件. 虽然现在有很多上传组件可以利用,但是了解Web上传文件的原理,对于处理突然出现的问题会有很大的帮助,下面就来讲一下通过浏览器上传文件的基本原理.在了解了原理之后,就可以非常容易地自制满足自身需要的上传组件

springMVC+jsp+ajax上传文件

工作中遇到的小问题,做个笔记 实现springMVC + jsp + ajax 上传文件 HTML <body> <form id="myform" method="post" > 登录名<input type="text" name="loginName" /> <br> 上传录音<input type="file" name="record