Python 3.x Flask:创建没有表单的上载服务器

Python 3.x Flask:创建没有表单的上载服务器,python-3.x,flask,file-upload,Python 3.x,Flask,File Upload,我写了一个小烧瓶服务器。目的是上传文件。重要的是,这是一个服务器,它只有一个RESTAPI,不呈现html和模板文件 代码如下: from flask import Flask, render_template, request, redirect, url_for app = Flask(__name__) @app.route('/') def index(): return render_template('index.html') @app.route('/', metho

我写了一个小烧瓶服务器。目的是上传文件。重要的是,这是一个服务器,它只有一个RESTAPI,不呈现html和模板文件

代码如下:

from flask import Flask, render_template, request, redirect, url_for

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/', methods=['POST'])
def upload_file():
    uploaded_file = request.files['file']
    if uploaded_file.filename != '':
        uploaded_file.save(uploaded_file.filename)
    return redirect(url_for('index'))
    
if __name__ == "__main__":
    app.run(debug=True)
我使用curl触发了此服务器:

curl -X POST -d file=/home/user1/Desktop/STEP_files/MyFile.txt 127.0.0.1:5000
然而,我得到了回报:

  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/werkzeug/datastructures.py", line 442, in __getitem__
    raise exceptions.BadRequestKeyError(key)
werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/user1/Desktop/flaskServer/server.py", line 11, in upload_file
    uploaded_file = request.files['file']
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/debughelpers.py", line 100, in __getitem__
    raise DebugFilesKeyError(request, key)
flask.debughelpers.DebugFilesKeyError: You tried to access the file "file" in the request.files dictionary but it does not exist.  The mimetype for the request is "application/x-www-form-urlencoded" instead of "multipart/form-data" which means that no file contents were transmitted.  To fix this error you should provide enctype="multipart/form-data" in your form.

The browser instead transmitted some file names. This was submitted: "/home/user1/Desktop/STEP_files/MyFile.txt"
错误消息对我来说不是很简单。。。 我根据书对服务器进行了编程(请记住,这是我的第一台flask服务器)。 不知道哪里出错了,或者我做错了什么

编辑:似乎我可以用curl成功地发送文件,但是文件没有保存在服务器存在的文件夹中

编辑2: 如果我像Mindsave suugested那样做
curl-X POST-F'file=/home/user1/Desktop/STEP_files/MyFile.txt'127.0.0.1:5000
,我会得到:

127.0.0.1 - - [02/Feb/2021 16:49:37] "POST / HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/user1/Desktop/flaskServer/server.py", line 11, in upload_file
    uploaded_file = request.files['file']
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/werkzeug/datastructures.py", line 442, in __getitem__
    raise exceptions.BadRequestKeyError(key)
werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
KeyError: 'file'
如果我做了
curl-xpost-d“file=@/home/user1/Desktop/STEP_files/MyFile.txt”127.0.0.1:5000

我得到:

127.0.0.1 - - [02/Feb/2021 16:53:11] "POST / HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/debughelpers.py", line 96, in __getitem__
    return oldcls.__getitem__(self, key)
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/werkzeug/datastructures.py", line 442, in __getitem__
    raise exceptions.BadRequestKeyError(key)
werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/user1/Desktop/flaskServer/server.py", line 11, in upload_file
    uploaded_file = request.files['file']
  File "/home/user1/anaconda3/envs/flaskTest/lib/python3.9/site-packages/flask/debughelpers.py", line 100, in __getitem__
    raise DebugFilesKeyError(request, key)
flask.debughelpers.DebugFilesKeyError: You tried to access the file "file" in the request.files dictionary but it does not exist.  The mimetype for the request is "application/x-www-form-urlencoded" instead of "multipart/form-data" which means that no file contents were transmitted.  To fix this error you should provide enctype="multipart/form-data" in your form.

The browser instead transmitted some file names. This was submitted: "@/home/user1/Desktop/STEP_files/Assembly_Test.step"

这里的问题是Curl命令,而不是Flask实现,使用-F发送多部分/表单数据请求,@snytax以默认方式发送文件,而不是以字符串形式发送文件名

curl -X POST -F file=@/home/user1/Desktop/STEP_files/MyFile.txt 127.0.0.1:5000

尝试“curl-X POST-F”file=/home/user1/Desktop/STEP_files/MyFile.txt“127.0.0.1:5000”除此之外,还可以在文件名前加一个@,即:curl-X POST-d“file=@/home/user1/Desktop/STEP_files/MyFile.txt”127.0.0.1:5000@Mindslave非常感谢。我试过你建议的东西。但它们没有起作用。我用你的方法和我得到的错误更新了我的问题。嗯,-F似乎让我们更接近了,因为它不再抱怨mimetype了。您还可以尝试将@syntax与-F一起使用吗?即curl-X POST-F file=@/home/user1/Desktop/STEP_files/MyFile.txt 127.0.0.1:5000@Mindslave你是上帝!成功了!非常感谢你!请做一个正常的答案,这样我就可以投票,并将其标记为选中的答案!