20

I am trying to upload a file to a server using curl and python flask. Below I have the code of how I have implemented it. Any ideas on what I am doing wrong.

curl -i -X PUT -F name=Test -F filedata=@SomeFile.pdf "http://localhost:5000/" 

@app.route("/", methods=['POST','PUT'])
def hello():
    file = request.files['Test']
    if file and allowed_file(file.filename):
        filename=secure_filename(file.filename)
        print filename

    return "Success"

The following is the error that the server sends back

<!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>

Thanks in advance.

4

2 回答 2

17

您的 curl 命令意味着您正在传输两个表单内容,一个名为 的文件,一个名为filedata的表单域name。所以你可以这样做:

file = request.files['filedata']   # gives you a FileStorage
test = request.form['name']        # gives you the string 'Test'

request.files['Test']不存在。

于 2013-06-26T21:23:44.257 回答
4

我在让它工作时遇到了很多问题,所以这是一个非常明确的解决方案:

在这里,我们制作了一个简单的烧瓶应用程序,它有两个路由,一个用于测试应用程序是否工作(“Hello World”),另一个用于打印文件名(以确保我们获得文件)。

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

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "Hello World"

@app.route("/print_filename", methods=['POST','PUT'])
def print_filename():
    file = request.files['file']
    filename=secure_filename(file.filename)   
    return filename

if __name__=="__main__":
    app.run(port=6969, debug=True)

首先我们测试我们是否可以联系应用程序:

curl http://localhost:6969
>Hello World

现在让我们发布一个文件并获取它的文件名。我们用“file=”来指代文件,因为“request.files['file']”指的是“file”。在这里,我们转到一个目录,其中包含一个名为“test.txt”的文件:

curl -X POST -F file=@test.txt http://localhost:6969/print_filename
>test.txt

最后,我们要使用文件路径:

curl -X POST -F file=@"/path/to/my/file/test.txt" http://localhost:6969/print_filename
>test.txt

既然我们已经确认我们实际上可以获取该文件,那么您可以使用标准 Python 代码对它进行任何操作。

于 2019-02-15T09:06:56.763 回答