python flask文件上传无声地失败

时间:2017-08-06 00:35:44

标签: python file flask request

我正在端口3000上运行一个烧瓶服务器,它接受端点:3000/upload上的POST请求。但是,文件上载部分不起作用。

@app.route('/upload', methods=['POST'])
def post_upload():
    print ("test")
    if request.method == 'POST':
        print ("test2")
        zfile = request.files['file']
        if zfile:
            print("test3")
            filename = secure_filename(zfile.filename)
            zfile.save(os.path.join(app.config['UPLOAD_FOLDER'],filename))
            return "success"
        else:
            print ("test4")
            return "fail"
    return 'blah'

我发送的帖子表格数据key等于filevalue是PNG图片。客户得到的回应是:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>400 Bad Request</title>
<h1>Bad Request</h1>
<p>The browser (or proxy) sent a request that this server could not understand.</p>

服务器上的打印输出为:

* Running on http://0.0.0.0:3000/ (Press CTRL+C to quit)
test
test2
104.148.224.253 - - [05/Aug/2017 19:30:04] "POST /upload HTTP/1.1" 400 -

为什么在zfile = request.files['file']之后无声地失败?

3 个答案:

答案 0 :(得分:0)

尝试使用flask推荐的文件上传格式,以便更好地进行错误检查。我猜这个&#39;文件&#39;字典中不存在,因此在检查值时会出错。 &#39;文件&#39;应该用文件输入元素的名称替换,因此如果你有&lt; input type = file name = file2&gt;,那么它应该是request.files [&#39; file2&#39;]。

来自http://flask.pocoo.org/docs/0.12/patterns/fileuploads/

def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        # check if the post request has the file part
        if 'file' not in request.files:
            flash('No file part')
            return redirect(request.url)
        file = request.files['file']
        # if user does not select file, browser also
        # submit a empty part without filename
        if file.filename == '':
            flash('No selected file')
            return redirect(request.url)
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            return redirect(url_for('uploaded_file',
                                filename=filename))
    return '''
    <!doctype html>
    <title>Upload new File</title>
    <h1>Upload new File</h1>
    <form method=post enctype=multipart/form-data>
      <p><input type=file name=file>
         <input type=submit value=Upload>
    </form>
    '''

答案 1 :(得分:0)

原来我从前一个POSTMAN请求中遗留了一些标题,这些标题搞砸了结果。我删除了它,它工作。标题是

Authorization:Basic ...
Content-Type:application/x-www-form-urlencoded

我猜测Content-Type标题搞砸了表单编码,但我不确定如何或为什么,因为它无声地失败。

答案 2 :(得分:0)

一篇文章中也有同样的问题。你可以用这个作为参考。我正在使用烧瓶休息api。 here

解析器应该是这样的。

parser.add_argument('file', type=werkzeug.datastructures.FileStorage, location='files' )