使用curl将文件上传到Python Flask服务器

25

我正在尝试使用curl和Python Flask将文件上传到服务器。下面是我实现它的代码。你有任何想法我做错了什么吗?

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"
以下是服务器返回的错误信息。
<!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>

提前致谢。


1
如果您使用POST方法发送数据,例如 curl -F "Test=@SomeFile.pdf" http://127.0.0.1:5000 ,则您的代码可以正常工作,因此问题集中在Flask处理PUT请求的方式上。 - Doobeh
@codegeek - 使用PUT或POST都可以正常工作。 - mata
@snahor,这个命令在Windows上应该怎么写? '@foo.txt' 不起作用... curl.exe -X PUT -F Test=...?... localhost:5000 - Piotr
据我所知,它应该可以在Windows上运行。运行后的输出是什么? - snahor
是的...那么它确切地是如何工作的?@foo.txt被替换为文件的内容吗?我在服务器端得到了它,但我想知道它确切地是如何工作的。 - Piotr
显示剩余2条评论
2个回答

20

您的curl命令表示您正在传输两个表单内容,一个名为filedata的文件和一个名为name的表单字段。 所以您可以这样做:

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

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


你如何添加文件? - Dinesh
@DineshVG,我不确定你的问题是什么意思。curl命令将带有给定文件或表单数据的POST请求发送到服务器,在请求对象上的路由中可以访问它们,如所示。 - mata
我有一个HTML页面,通过它我可以:
  • 通过附加文件发送POST请求 我尝试使用curl命令,但它没有起作用。
后来我发现...我必须提供两个键值对。一个是文件名,另一个是文件本身。然后就成功了。
- Dinesh

9

我遇到了很多问题才使这个工作,所以这里提供一个非常明确的解决方案:

我们创建一个简单的Flask应用程序,其中有两个路由:一个用于测试应用程序是否正常工作(“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

现在让我们POST一个文件并获取它的文件名。我们使用"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代码对其进行任何操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接