2013-11-21 6 views
1

web.py 앱을 서버로 사용하고 클라이언트의 JQuery를 사용하고 있습니다. 응용 프로그램의 일부 파일을 업로드해야하고, 나는 그것을 클라이언트에두고 작업을 진행 :대용량 파일을 업로드하는 방법 AJAX + Web.py

$('#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 aprox. 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 

은 무엇 2GBs보다 파일을 더 업로드 할 수 있습니다?

+0

한 :

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); } } 

마지막으로, 우리는 전송의 끝을 표시하는 최종 메시지를 보내 아직 안 잤니? –

+0

필자는 최대 파일 크기를 제한하는 구성을 변경해야한다고 생각합니다. –

+0

@AlexTwain <2GB 크기로 파일을 분할하여 해결했습니다. – Zhen

답변

0

파일을 조각으로 나누어서 한 번에 하나씩 서버에 보내는 문제를 해결했습니다.

첫째, 우리는 파일 전송 과정에 대한 정보가 포함 된 변수를 만들고, 우리는 시작하기 위해 서버에 메시지를 보내

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