2017-04-13 3 views
1

클라이언트 (Python request.post 사용)에서 대용량 파일 (~ 1GB)을 플라스크 서버에 업로드하려고합니다.Python Flask 청크 데이터 업로드가 작동하지 않습니다.

클라이언트가 서버에 요청을 1024 청크로 전송하면 서버가 전체 파일을 읽고 서버 0kb에 저장하지 않습니다.

정확하게 여기서 착각하고있는 디버깅을 도와주십시오.

서버 - 플라스크 코드 :

from flask import Flask, request, jsonify 
from werkzeug.utils import secure_filename 
import os 

app = Flask(__name__) 

app.config['UPLOAD_FOLDER'] = 'uploads/' 

@app.route("/upload/<filename>", methods=["POST", "PUT"]) 
def upload_process(filename): 
    filename = secure_filename(filename) 
    fileFullPath = os.path.join(app.config['UPLOAD_FOLDER'], filename) 

    with open(fileFullPath, "wb") as f: 
     chunk_size = 1024 
     chunk = request.stream.read(chunk_size) 
     f.write(chunk) 
    return jsonify({'filename': filename}) 


if __name__ == '__main__': 
    app.run(host="0.0.0.0", port=int("8080"),debug=True) 

클라이언트 - 요청 코드

import os 
import requests 


def read_in_chunks(file_object, chunk_size=1024): 
    while True: 
     data = file_object.read(chunk_size) 
     if not data: 
      break 
     yield data 


def main(fname, url): 
    content_path = os.path.abspath(fname) 
    with open(content_path, 'r') as f: 
     try: 
      r = requests.post(url, data=read_in_chunks(f)) 
      print "r: {0}".format(r) 
     except Exception, e: 
      print e 


if __name__ == '__main__': 
    filename = 'bigfile.zip' # ~1GB 
    url = 'http://localhost:8080/upload/{0}'.format(filename) 
    main(filename, url) 
+1

플라스크 서버 전에 전달 프록시 서버를 사용합니까? – stamaimer

+0

아마도 모든 데이터가 처리 될 때 '없음'을 반환하기 때문에? while 루프에서'return' 대신에'break'하면 어떨까요? – dimmg

+0

stamaimer : 아니요, 직접적인 요청 및 응답 코드입니다. 청크로 데이터를 받아들이는 방법을 알고 싶을뿐입니다. dimmg : None을 제거하려고했으나 각 요청은 계속 청크 버퍼를 유지하는 대신 1KB로만 간주됩니다. –

답변

0

플라스크 스트림을 처리 할 werkzeug에 따라 달라지며 demands a content length for a stream을 WERKZEUG. 이 here에 스레드가 있지만 다른 프레임 워크 접근 방식을 취하는 것 외에는 현재 사용할 수있는 실제 솔루션이 없습니다.

+0

이것은 거의 유일한 링크 기반 답변입니다. 미래에 이러한 링크가 작동하지 않는다면이 대답은 그리 유용하지 않을 것입니다. 그렇기 때문에 당신이 말하는 링크의 중요한 정보를 답변 자체에 포함시키는 것이 좋습니다. – mrun