Jquery 如何上传大文件AJAX+;Web.py
我使用web.py应用程序作为服务器,在客户端使用JQuery。应用程序的一部分需要上传文件,我在客户端使用它:Jquery 如何上传大文件AJAX+;Web.py,jquery,ajax,file-upload,web.py,Jquery,Ajax,File Upload,Web.py,我使用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.s
$('#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的文件?我解决了将文件分块并将其一次一个发送到服务器的问题 首先,我们创建一个变量,该变量包含有关文件和传输过程的信息,并向服务器发送一条消息以启动:
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 )
}
你解决了这个问题吗?我确实认为你应该在某个地方更改一个限制最大文件大小的配置。@AlexTwain我解决了这个问题,将文件分块,但如何做到这一点?你能在这里用你的方法给出答案吗?