ajax如何 实现 文件上传

ajax如何 实现 文件上传,第1张

程序说明

使用说明

实例化时,第一个必要参数是file控件对象:

new QuickUpload(file)

第二个可选参数用来设置系统的默认属性,包括

属性:    默认值//说明

parameter: {},//参数对象

action:  "",//设置action

timeout: 0,//设置超时(秒为单位)

onReady: function(){},//上传准备时执行

onFinish: function(){},//上传完成时执行

onStop:  function(){},//上传停止时执行

onTimeout: function(){}//上传超时时执行

还提供了以下方法:

upload:执行上传操作;

stop:停止上传操作;

dispose:销毁程序。

var QuickUpload = function(file, options) {

this.file = $$(file)

this._sending = false//是否正在上传

this._timer = null//定时器

this._iframe = null//iframe对象

this._form = null//form对象

this._inputs = {}//input对象

this._fFINISH = null//完成执行函数

$$.extend(this, this._setOptions(options))

}

QuickUpload._counter = 1

QuickUpload.prototype = {

//设置默认属性

_setOptions: function(options) {

this.options = {//默认值

action:        "",//设置action

timeout:    0,//设置超时(秒为单位)

parameter:    {},//参数对象

onReady:    function(){},//上传准备时执行

onFinish:    function(){},//上传完成时执行

onStop:        function(){},//上传停止时执行

onTimeout:    function(){}//上传超时时执行

}

return $$.extend(this.options, options || {})

},

//上传文件

upload: function() {

//停止上一次上传

this.stop()

//没有文件返回

if ( !this.file || !this.file.value ) return

//可能在onReady中修改相关属性所以放前面

this.onReady()

//设置iframe,form和表单控件

this._setIframe()

this._setForm()

this._setInput()

//设置超时

if ( this.timeout > 0 ) {

this._timer = setTimeout( $$F.bind(this._timeout, this), this.timeout * 1000 )

}

//开始上传

this._form.submit()

this._sending = true

},

//设置iframe

_setIframe: function() {

if ( !this._iframe ) {

//创建iframe

var iframename = "QUICKUPLOAD_" + QuickUpload._counter++,

iframe = document.createElement( $$B.ie ? "<iframe name=\"" + iframename + "\">" : "iframe")

iframe.name = iframename

iframe.style.display = "none"

//记录完成程序方便移除

var finish = this._fFINISH = $$F.bind(this._finish, this)

//iframe加载完后执行完成程序

if ( $$B.ie ) {

iframe.attachEvent( "onload", finish )

} else {

iframe.onload = $$B.opera ? function(){ this.onload = finish } : finish

}

//插入body

var body = document.body body.insertBefore( iframe, body.childNodes[0] )

this._iframe = iframe

}

},

//设置form

_setForm: function() {

if ( !this._form ) {

var form = document.createElement('form'), file = this.file

//设置属性

$$.extend(form, {

target: this._iframe.name, method: "post", encoding: "multipart/form-data"

})

//设置样式

$$D.setStyle(form, {

padding: 0, margin: 0, border: 0,

backgroundColor: "transparent", display: "inline"

})

//提交前去掉form

file.form && $$E.addEvent(file.form, "submit", $$F.bind(this.dispose, this))

//插入form

file.parentNode.insertBefore(form, file).appendChild(file)

this._form = form

}

//action可能会修改

this._form.action = this.action

},

//设置input

_setInput: function() {

var form = this._form, oldInputs = this._inputs, newInputs = {}, name

//设置input

for ( name in this.parameter ) {

var input = form[name]

if ( !input ) {

//如果没有对应input新建一个

input = document.createElement("input")

input.name = name input.type = "hidden"

form.appendChild(input)

}

input.value = this.parameter[name]

//记录当前input

newInputs[name] = input

//删除已有记录

delete oldInputs[name]

}

//移除无用input

for ( name in oldInputs ) { form.removeChild( oldInputs[name] ) }

//保存当前input

this._inputs = newInputs

},

//停止上传

stop: function() {

if ( this._sending ) {

this._sending = false

clearTimeout(this._timer)

//重置iframe

if ( $$B.opera ) {//opera通过设置src会有问题

this._removeIframe()

} else {

this._iframe.src = ""

}

this.onStop()

}

},

//销毁程序

dispose: function() {

this._sending = false

clearTimeout(this._timer)

//清除iframe

if ( $$B.firefox ) {

setTimeout($$F.bind(this._removeIframe, this), 0)

} else {

this._removeIframe()

}

//清除form

this._removeForm()

//清除dom关联

this._inputs = this._fFINISH = this.file = null

},

//清除iframe

_removeIframe: function() {

if ( this._iframe ) {

var iframe = this._iframe

$$B.ie ? iframe.detachEvent( "onload", this._fFINISH ) : ( iframe.onload = null )

document.body.removeChild(iframe) this._iframe = null

}

},

//清除form

_removeForm: function() {

if ( this._form ) {

var form = this._form, parent = form.parentNode

if ( parent ) {

parent.insertBefore(this.file, form) parent.removeChild(form)

}

this._form = this._inputs = null

}

},

//超时函数

_timeout: function() {

if ( this._sending ) { this._sending = false this.stop() this.onTimeout() }

},

//完成函数

_finish: function() {

if ( this._sending ) { this._sending = false this.onFinish(this._iframe) }

}

}

引入ajaxfileupload.js

jQuery.extend({

    createUploadIframe: function(id, uri)

    {

        //create frame

        var frameId = 'jUploadFrame' + id

        if(window.ActiveXObject) {

            var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />')

            if(typeof uri== 'boolean'){

                io.src = 'javascript:false'

            }

            else if(typeof uri== 'string'){

                io.src = uri

            }

        }

        else {

            var io = document.createElement('iframe')

            io.id = frameId

            io.name = frameId

        }

        io.style.position = 'absolute'

        io.style.top = '-1000px'

        io.style.left = '-1000px'

        document.body.appendChild(io)

        return io

    },

    createUploadForm: function(id, fileElementId)

    {

        //create form

        var formId = 'jUploadForm' + id

        var fileId = 'jUploadFile' + id

        var form = $('<form  action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>')

        var oldElement = $('#' + fileElementId)

        var newElement = $(oldElement).clone()

        $(oldElement).attr('id', fileId)

        $(oldElement).before(newElement)

        $(oldElement).appendTo(form)

        //set attributes

        $(form).css('position', 'absolute')

        $(form).css('top', '-1200px')

        $(form).css('left', '-1200px')

        $(form).appendTo('body')

        return form

    },

    addOtherRequestsToForm: function(form,data)

    {

        // add extra parameter

        var originalElement = $('<input type="hidden" name="" value="">')

        for (var key in data) {

            name = key

            value = data[key]

            var cloneElement = originalElement.clone()

            cloneElement.attr({'name':name,'value':value})

            $(cloneElement).appendTo(form)

        }

        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)

        if ( s.data ) form = jQuery.addOtherRequestsToForm(form,s.data)

        var io = jQuery.createUploadIframe(id, s.secureuri)

        var frameId = 'jUploadFrame' + id

        var formId = 'jUploadForm' + id

        // Watch for a new set of requests

        if ( s.global && ! jQuery.active++ )

        {

            jQuery.event.trigger( "ajaxStart" )

        }

        var requestDone = false

        // Create the request object

        var xml = {}

        if ( s.global )

            jQuery.event.trigger("ajaxSend", [xml, s])

        // Wait for a response to come back

        var uploadCallback = function(isTimeout)

        {

            var io = document.getElementById(frameId)

            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

                    {

                        $(io).remove()

                        $(form).remove()

                    } 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 io = $('#' + frameId)

            var form = $('#' + formId)

            $(form).attr('action', s.url)

            $(form).attr('method', 'POST')

            $(form).attr('target', frameId)

            if(form.encoding)

            {

                form.encoding = 'multipart/form-data'

            }

            else

            {

                form.enctype = 'multipart/form-data'

            }

            $(form).submit()

        } catch(e)

        {

            jQuery.handleError(s, xml, null, e)

        }

        if(window.attachEvent){

            document.getElementById(frameId).attachEvent('onload', uploadCallback)

        }

        else{

            document.getElementById(frameId).addEventListener('load', uploadCallback, false)

        }

        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" )

        {

            // If you add mimetype in your response,

            // you have to delete the '<pre></pre>' tag.

            // The pre tag in Chrome has attribute, so have to use regex to remove

            var data = r.responseText

            var rx = new RegExp("<pre.*?>(.*?)</pre>","i")

            var am = rx.exec(data)

            //this is the desired data extracted

            var data = (am) ? am[1] : ""    //the only submatch or empty

            eval( "data = " + data )

        }

        // evaluate scripts within html

        if ( type == "html" )

            jQuery("<div>").html(data).evalScripts()

        //alert($('param', data).each(function(){alert($(this).attr('value'))}))

        return data

    }

})

2.引入上传文件所需的jar

3.配置servlet.xml(不是web.xml)

4.jsp上传框

5.ajax传文件到后台

6.后台接收文件

7.获取之后怎么处理自己看着办咯,我只能帮到这里了

HTTP File Server

http-file-server 是用 python 实现的 HTTP 文件服务器,支持上传和下载文件。

运行

$ python file-server.py files 8001

其中第一个参数 files 是存放文件的路径,第二个参数 8001 是 HTTP 服务器端口。

接口

1. 读取文件

GET /pathtofile/filename

2. 读取文件夹下所有文件(已经忽略隐藏文件)

GET /path

返回文件列表为 JSON 数组,文件名末尾带有 / 的表示是文件夹。 filename 为文件名,mtime 为修改时间。

[{"filename":"f1.txt","mtime":1001},{"filename":"p3/","mtime":1002}]

3. 上传文件

采用 POST 方式上传文件,URL 参数中传参数 name 表示上传的文件名,POST 内容为文件内容。

POST /upload?name=filename

ajax 示例:

// file is a FileReader object

var data = file.readAsArrayBuffer()

var xhr = new XMLHttpRequest()

var url = "http://localhost:8001/upload?name=xxx.md"

xhr.open("post", url, true)

xhr.setRequestHeader("Accept", "application/json, text/javascript, */*q=0.01")

xhr.onreadystatechange = function() {

if (xhr.readyState==4 &&xhr.status==200)

{

console.log(xhr.responseText)

}

}

xhr.send(data)

文件名 filename 可以包含相对路径。比如:upload?name=md/xxx.md。则上传至 md 目录下。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/127547.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-15
下一篇2023-03-15

发表评论

登录后才能评论

评论列表(0条)

    保存