ajax图片单个上传(ajaxfileupload.js)

开发过程中发现,页面总是只能存在一个图片,如果有两个图片,或者多个,就没法上传了。比较困惑怎么会有这样的事情呢?

知道今天开发完后我才测试了下,发现同一个页面单个上传N个图都是没有问题的。

下面是实例。

http://files.cnblogs.com/bin-pureLife/ajaxupload.zip

发现我上面遇到的问题是不存在,另外看了下实现原理,是通过构造了一个不可见的iframe,然后在发送http请求达成的。

我项目中遇到这种问题的原因。

排查:

这是调用upload前的方法。

function doUpload(o){

        $(o).attr(‘name‘,‘userphoto‘)
        $(o).attr(‘id‘,‘userphoto‘)
        o = (o.attributes[‘bin‘].nodeValue)
        if(o == ‘a‘){
           //填充一个假地址
           $("#showpage_sty_1").val(‘ed‘);
           upload(‘/StoreManage/upload/key/showimage/tempname/userphoto‘,‘show_1‘,‘userphoto‘);
        }else if(o =="b"){
            $("#showpage_sty_2").val(‘ed‘);
            upload(‘/StoreManage/upload/key/ewmimage/tempname/userphoto‘,‘show_2‘,‘userphoto‘);
        }else if(o == ‘c‘){
            $("#showpage_sty_3").val(‘ed‘);
            upload(‘/StoreManage/upload/key/showimage/tempname/userphoto‘,‘show_3‘,‘userphoto‘);
        }
    }

动态的先加上去 属性name  和 ID

我之前用的是类似

id=userphoto1 name = userphoto1

id=userphoto2 name = userphoto2

id=userphoto3 name = userphoto3

就和今天例子中写的一样,但是我发现请求一过去,只有第一个能够打印不为空的$_FILE 。

确定请求路径正确;

function upload(url,replaceUrl,fileElementId){

    $.ajaxFileUpload
    (
        {
            url:url, //用于文件上传的服务器端请求地址
            secureuri: false, //一般设置为false
            fileElementId: fileElementId, //文件上传空间的id属性  <input type="file" id="file" name="file" />
            dataType: ‘HTML‘, //返回值类型 一般设置为json
            success: function (data, status)  //服务器成功响应处理函数
            {
                if(data != "error"){
                    $("#"+replaceUrl).attr(‘src‘,data);
                }
                //无需理解这段代码。为了上传。
                if(replaceUrl == ‘show_1‘){
                    $(":file").eq(0).removeAttr(‘name‘)
                    $(":file").eq(0).removeAttr(‘id‘)
                }else if(replaceUrl == ‘show_2‘){
                    $(":file").eq(1).removeAttr(‘name‘)
                    $(":file").eq(1).removeAttr(‘id‘)
                }else{
                    $(":file").eq(2).removeAttr(‘name‘)
                    $(":file").eq(2).removeAttr(‘id‘)
                }
            },
            error: function (data, status, e)//服务器响应失败处理函数
            {
                alert(e);
            }
        }
    )
}

这是我出现问题后改成这样子了,就解决了问题。

源码解读:

jQuery.extend({

  //在方法内创建添加一个iframe        //style="position:absolute; top:-9999px; left:-9999px" 让其在界面上看不见
    createUploadIframe: function(id, uri)
    {
            //create frame
            var frameId = ‘jUploadFrame‘ + id;
            var iframeHtml = ‘<iframe id="‘ + frameId + ‘" name="‘ + frameId + ‘" style="position:absolute; top:-9999px; left:-9999px"‘;
            if(window.ActiveXObject)
            {
                if(typeof uri== ‘boolean‘){
                    iframeHtml += ‘ src="‘ + ‘javascript:false‘ + ‘"‘;

                }
                else if(typeof uri== ‘string‘){
                    iframeHtml += ‘ src="‘ + uri + ‘"‘;

                }
            }
            iframeHtml += ‘ />‘;
            jQuery(iframeHtml).appendTo(document.body);

            return jQuery(‘#‘ + frameId).get(0);
    },
    createUploadForm: function(id, fileElementId, data)
    {
        //create form   创建表单,
        var formId = ‘jUploadForm‘ + id;
        var fileId = ‘jUploadFile‘ + id;
        var form = jQuery(‘<form  action="" method="POST" name="‘ + formId + ‘" id="‘ + formId + ‘" enctype="multipart/form-data"></form>‘);
        if(data)
        {
            for(var i in data)
            {
                jQuery(‘<input type="hidden" name="‘ + i + ‘" value="‘ + data[i] + ‘" />‘).appendTo(form);
            }
        }
        var oldElement = jQuery(‘#‘ + fileElementId);//取到之前的 也就是我们传过来的 file的id
        var newElement = jQuery(oldElement).clone();//把代码克隆过来
        jQuery(oldElement).attr(‘id‘, fileId);//修改了原来的file的ID 属性
        jQuery(oldElement).before(newElement);//在旧的file前面加上新的file对象
        jQuery(oldElement).appendTo(form);//把原来的对象传入到创建的表单中去

      //问题应该就在这里 在这里完成  file的克隆, 只有一种可能,那就是当第一个图片传递完成之后,当第二次点击传第二张图片的时候,依旧这里取得还是第一个的file 所以才会为空。          问题应该出在,file id 没有动态对应好。

        //set attributes
        jQuery(form).css(‘position‘, ‘absolute‘);
        jQuery(form).css(‘top‘, ‘-1200px‘);
        jQuery(form).css(‘left‘, ‘-1200px‘);
        jQuery(form).appendTo(‘body‘);
        return form;
    },

    ajaxFileUpload: function(s) {
        // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout
        s = jQuery.extend({}, jQuery.ajaxSettings, s);
        var id = new Date().getTime()
        var form = jQuery.createUploadForm(id, s.fileElementId, (typeof(s.data)==‘undefined‘?false:s.data));
        var io = jQuery.createUploadIframe(id, s.secureuri);      //分别穿件 form 和 iframe
        var frameId = ‘jUploadFrame‘ + id;
        var formId = ‘jUploadForm‘ + id;          
        // Watch for a new set of requests
        if ( s.global && ! jQuery.active++ )
        {
            jQuery.event.trigger( "ajaxStart" ); //触发ajaxStart方法
        }
        var requestDone = false;
        // Create the request object
        var xml = {}
        if ( s.global )
            jQuery.event.trigger("ajaxSend", [xml, s]);//触发ajaxSend方法
        // Wait for a response to come back

      //回调函数
        var uploadCallback = function(isTimeout)
        {
            var io = document.getElementById(frameId);//获取iframe 对象
            try
            {
                if(io.contentWindow)
                {
                     xml.responseText = io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null;
                     xml.responseXML = io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocument:io.contentWindow.document;

                }else if(io.contentDocument)
                {
                     xml.responseText = io.contentDocument.document.body?io.contentDocument.document.body.innerHTML:null;
                    xml.responseXML = io.contentDocument.document.XMLDocument?io.contentDocument.document.XMLDocument:io.contentDocument.document;
                }
            }catch(e)
            {
                jQuery.handleError(s, xml, null, e);
            }
            if ( xml || isTimeout == "timeout")
            {
                requestDone = true;
                var status;          //请求状态 成功 或者 不成功,
                try {
                    status = isTimeout != "timeout" ? "success" : "error";
                    // Make sure that the request was successful or notmodified
                    if ( status != "error" )
                    {
                        // process the data (runs the xml through httpData regardless of callback)
                        var data = jQuery.uploadHttpData( xml, s.dataType );
                        // If a local callback was specified, fire it and pass it the data
                        if ( s.success )
                            s.success( data, status );

                        // Fire the global callback
                        if( s.global )
                            jQuery.event.trigger( "ajaxSuccess", [xml, s] );
                    } else
                        jQuery.handleError(s, xml, status);
                } catch(e)
                {
                    status = "error";
                    jQuery.handleError(s, xml, status, e);
                }

                // The request was completed
                if( s.global )
                    jQuery.event.trigger( "ajaxComplete", [xml, s] );

                // Handle the global AJAX counter
                if ( s.global && ! --jQuery.active )
                    jQuery.event.trigger( "ajaxStop" );

                // Process result
                if ( s.complete )
                    s.complete(xml, status);

                jQuery(io).unbind()

                setTimeout(function()
                                    {    try
                                        {
                                            jQuery(io).remove();//去除穿件的iframe 实际上应该是去除remove就够了.
                                            jQuery(form).remove(); //去除创建的 from 表单

                                        } catch(e)
                                        {
                                            jQuery.handleError(s, xml, null, e);
                                        }                                    

                                    }, 100)

                xml = null

            }
        }
        // Timeout checker
        if ( s.timeout > 0 )
        {
            setTimeout(function(){
                // Check to see if the request is still happening
                if( !requestDone ) uploadCallback( "timeout" );
            }, s.timeout);
        }
        try
        {

            var form = jQuery(‘#‘ + formId);
            jQuery(form).attr(‘action‘, s.url);
            jQuery(form).attr(‘method‘, ‘POST‘);
            jQuery(form).attr(‘target‘, frameId);
            if(form.encoding)
            {
                jQuery(form).attr(‘encoding‘, ‘multipart/form-data‘);
            }
            else
            {
                jQuery(form).attr(‘enctype‘, ‘multipart/form-data‘);
            }
            jQuery(form).submit();

        } catch(e)
        {
            jQuery.handleError(s, xml, null, e);
        }

        jQuery(‘#‘ + frameId).load(uploadCallback    );
        return {abort: function () {}};    

    },

    uploadHttpData: function( r, type ) {
        var data = !type;
        data = type == "xml" || data ? r.responseXML : r.responseText;
        // If the type is "script", eval it in global context
        if ( type == "script" )
            jQuery.globalEval( data );
        // Get the JavaScript object, if JSON is used.
        if ( type == "json" )
            eval( "data = " + data );
        // evaluate scripts within html
        if ( type == "html" )
            jQuery("<div>").html(data).evalScripts();

        return data;
    }
})
时间: 2024-10-12 23:56:51

ajax图片单个上传(ajaxfileupload.js)的相关文章

前端图片压缩上传(纯js的质量压缩,非大小压缩)

此demo为大于1M对图片进行压缩上传 若小于1M则原图上传,可以根据自己实际需求更改. demo源码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>XMLHttpRequest上传文件</title> <script type="text/javascript"> /* 三个参数 file:一个是文件(

前端图片压缩上传(纯js的质量压缩,非长宽压缩)

原文: 此demo为大于1M对图片进行压缩上传 若小于1M则原图上传,可以根据自己实际需求更改. demo源码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>XMLHttpRequest上传文件</title> <script type="text/javascript"> /* 三个参数 file:一个

纯原生js移动端图片压缩上传插件

前段时间,同事又来咨询一个问题了,说手机端动不动拍照就好几M高清大图,上传服务器太慢,问问我有没有可以压缩图片并上传的js插件,当然手头上没有,别慌,我去网上搜一搜. 结果呢,呵呵...诶~又全是基于jquery.zepto的(这句话似乎吐槽次数太多了...),然后我也就不吐槽了, 然后当然是自己做了,先上图: 纯原生js的移动端图片压缩上传插件,不依赖任何库 用法 在html页面中引入input标签,通过自定义属性data-LUploader绑定点击触发的标签id,写法如下: <div cla

ajaxfileupload.js插件结合一般处理文件实现Ajax无刷新上传

先上几张图更直观展示一下要实现的功能.本功能主要通过Jquery ajaxfileupload.js插件结合ajaxUpFile.ashx一般应用程序处理文件实现Ajax无刷新上传功能,结合NPOI2.0实现数据读取.这个功能在实际工作种经经常使用到,希望能给须要做这方面的人有些帮助. 一.功能页面布局及介绍 1.上传页面布局及input file上传功能 2.上传页面文件正在上传效果 3.上传完毕效果,多文件展示区 二.功能代码实现及资源引用 1.js资源文件引用 html页面js引用.须要引

移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传

现在科技太发达,移动设备像素越来越高,随便一张照片2M+,但是要做移动端图片上传和pc上略有不同,移动端你不能去限制图片大小,让用户先处理图片再上传,这样不现实.所以理解的解决方案就是在上传先进行图片压缩,然后再把压缩后的图片上传到服务器. 一翻google之后,发现了localResizeIMG,它会对图片进行压缩成你指定宽度及质量度并转换成base64图片格式,那么我们就可以把这个base64通过ajax传到后台,再进行保存,先压缩后上传的目的就达到了. 处理过程 LocalResizeIM

js实现图片文件上传的心得

今天研究一下图片上存的一个实现方法,由于上周没写技术周记,这次一定要写好! 那么问题来了:PHP处理图片上传时要求JQ实现数据的交互,怎么办? 这里涉及到的一个logo上传的需求,根据radio选择是否更新logo,同时form表单将以js事件处理 <div class="comLogo sbox"> <div class="CLheader">公司logo:</div> <div class="ui-imgsel

JS案例之4——Ajax多图上传

近期项目中有好几次用到多图上传,第一次在项目中真正用到Ajax技术,稍微整理了下,贴个案例出来. 我们传统的做法是当用户提交一个表单时,就向web服务器端发送一个请求.服务器接受并处理传来的表单信息,处理完成后返回一个新的页面.这个做法比较浪费带宽,当请求数较多时,页面响应的时间就依赖于服务器处理的时间. 而Ajax应用仅向服务器发送并取回必需的数据,其他不需要的数据不用响应,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JS来处理来自服务器的响应.因此在服务器和

动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传

现在科技太发达,移动设备像素越来越高,随便一张照片2M+,但是要做移动端图片上传和pc上略有不同,移动端你不能去限制图片大小,让用户先处理图片再上传,这样不现实.所以理解的解决方案就是在上传先进行图片压缩,然后再把压缩后的图片上传到服务器. 一翻google之后,发现了localResizeIMG,它会对图片进行压缩成你指定宽度及质量度并转换成base64图片格式,那么我们就可以把这个base64通过ajax传到后台,再进行保存,先压缩后上传的目的就达到了. 处理过程 LocalResizeIM

PHP+jQuery.photoClip.js支持手势的图片裁剪上传实例

PHP+jQuery.photoClip.js支持手势的图片裁剪上传实例,在手机上双指捏合为缩放,双指旋转可根据旋转方向每次旋转90度,在电脑上鼠标滚轮为缩放,双击则顺时针旋转90度. 下面让我们来看看核心代码: post的是base64,后端处理base64转存图片. 1 $("#clipArea").photoClip({ 2 width: 200, 3 height: 200, 4 file: "#file", 5 view: "#view"