2017-04-13 13 views
1

我試圖從上傳客戶端一個大文件(比如說〜1GB)(使用Python request.post),歷時服務器。的Python瓶塊數據上傳不工作

當客戶發送的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

也許是因爲您在處理所有數據時返回'None'?如果你在while循環中'break',而不是'return'會怎麼樣? – dimmg

+0

stamaimer:不,這是一個直接的請求和響應代碼。只是想知道如何接收大塊數據。昏暗:我試圖刪除無,但仍然認爲每個請求只有1KB而不是繼續chunks緩衝區。 –

回答

0

瓶取決於werkzeug處理流,WERKZEUG demands a content length for a stream。這個here有一個線程,但目前沒有真正的解決方案,除了採取另一種框架方法。

+0

這幾乎是唯一一個基於鏈接的答案。如果將來某些時候這些鏈接不起作用,這個答案將不會很有用。這就是爲什麼我們鼓勵你在答案本身中包含你所指的鏈接的重要信息。 – mrun