我正在端口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
等于file
而value
是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']
之后无声地失败?
答案 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'
)