【问题标题】:Upload a file to a python flask server using curl使用 curl 将文件上传到 python 烧瓶服务器
【发布时间】:2013-06-24 02:59:12
【问题描述】:

我正在尝试使用 curl 和 python 烧瓶将文件上传到服务器。下面我有我如何实现它的代码。关于我做错了什么的任何想法。

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>

提前致谢。

【问题讨论】:

  • 如果您发布数据,您的代码就可以工作,例如curl -F "Test=@SomeFile.pdf" http://127.0.0.1:5000 因此将您的问题缩小到您如何在 Flask 中处理 PUT 请求。
  • 我记得一些线程说 request.files 不适用于 PUT。你可以试试 request.data 吗?
  • 你的代码看起来不错,如果你试试会得到什么:curl -X PUT -F Test=@foo.txt localhost:5000
  • @codegeek - 它适用于 PUT 或 POST。
  • @snahor 这个命令在 Windows 上的外观如何? '@foo.txt' 不起作用... curl.exe -X PUT -F Test=...?... localhost:5000

标签: python curl flask


【解决方案1】:

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

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

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

【讨论】:

  • 如何添加文件?
  • @DineshVG 我不确定你的问题是什么意思。 curl 命令将带有给定文件或表单数据的发布请求发送到服务器,可以在请求对象上的路由中访问它们,如图所示。
  • 我有一个 html 页面,通过它我 - 发送一个发布请求 - 通过附加一个文件,我使用 curl 命令尝试过它,它没有工作。后来我想通了......我必须提供两个键值对......一个用于文件名,另一个用于文件本身。并让它工作..
【解决方案2】:

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

这里我们制作了一个简单的烧瓶应用程序,它有两个路由,一个用于测试应用程序是否工作(“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 代码对它进行任何操作。

【讨论】:

    猜你喜欢
    • 2021-06-08
    • 2016-12-01
    • 1970-01-01
    • 2020-08-30
    • 2017-12-03
    • 2013-11-19
    • 2021-11-21
    • 1970-01-01
    • 2021-07-03
    相关资源
    最近更新 更多