【问题标题】:How to upload big files AJAX + Web.py如何上传大文件 AJAX + Web.py
【发布时间】:2013-11-21 17:20:22
【问题描述】:

我使用 web.py 应用程序作为服务器,在客户端使用 JQuery。应用程序的一部分需要上传文件,我让它在客户端中使用:

$('#filesend').click( function(){
    var xhr = new XMLHttpRequest();

    xhr.open( 'PUT', '/ajax/file', true );

    var form = $('#fileform')[0];
    var fd = new FormData( form );
    xhr.send( fd );
});

并在服务器中使用此代码:

def PUT( self ):
    try:
        x = web.input(myfile={})
        filename = data.getUserFilename( session.user, x['myfile'].filename )
        data.saveFile( filename, x['myfile'].file )
    except:
            print sys.exc_info()
            web.debug( "can't save file" )

    return "OK"

但是,当我使用大约 2GBs 的文件时。我在 web.input 方法中遇到错误。

    File "/usr/local/lib/python2.7/dist-packages/web/wsgiserver/__init__.py", line 1008, in readline
    bline = buf.readline(size)
OverflowError: signed integer is greater than maximum

当文件太大时,我可以在客户端使用当前方法上传,但是,可以使用什么来上传大于 2GB 的文件?

【问题讨论】:

  • 你解决了吗?
  • 我确实认为您应该在某处更改限制最大文件大小的配置。
  • @AlexTwain 我解决了将文件分成
  • 但是怎么做呢?你能用你的方法在这里发布答案吗?

标签: jquery ajax file-upload web.py


【解决方案1】:

我解决了将文件分块并一次一个地发送到服务器的问题。

首先,我们创建一个变量,其中包含文件和传输过程的信息,我们向服务器发送消息启动:

function sendBigFile(){
    var input = $('#filesel')[0]
    var file = input.files[0]
    var descriptor = {
        sended: 0,
        file: file,
        filename: file.name,
        total: file.size,
        chunkSize: 5*1024*1024,
    }

    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function( e ){
        if( 4 == this.readyState ){
            sendBigFilePart( descriptor )
        }
    };

    xhr.open( 'PUT', '/web/ajax/filepart', true )

    var fd = new FormData()
    fd.append( 'status', 'start' )
    fd.append( 'myfilename', descriptor.filename )
    xhr.send( fd )
}

然后发送文件的每一部分:

function sendBigFilePart( desc ){
    if( desc.sended >= desc.total ){
        // assert desc.sended == desc.total ??
        sendBigFileEnd( desc )
    }else{
        var chunk = Math.min( desc.total - desc.sended, desc.chunkSize )
        var current = desc.sended
        var blob = desc.file.slice( current, current + chunk )

        desc.sended = desc.sended + chunk

        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function( e ){
            if( 4 == this.readyState ){
                sendBigFilePart( desc )
            }
        };

        xhr.open( 'PUT', '/web/ajax/filepart', true );

        var fd = new FormData();
        fd.append( 'myfile', blob )
        fd.append( 'status', 'part' )
        fd.append( 'myfilename', desc.filename )
        xhr.send( fd );
    }
}

最后,我们发送一个最终消息来标记传输结束:

function sendBigFileEnd( desc ){
    var xhr = new XMLHttpRequest();

    xhr.open( 'PUT', '/web/ajax/filepart', true )

    var fd = new FormData()
    fd.append( 'status', 'end' )
    fd.append( 'myfilename', desc.filename )
    xhr.send( fd )
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 2014-02-28
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2011-09-20
    相关资源
    最近更新 更多