python - 在没有 multipart/form-data 的 Flask 中 ReSTfully 上传文件

标签 python rest flask multipartform-data

我试图在不使用任何类型的 multipart/form-data 的情况下将二进制文件上传到 Flask 端点。我想简单地 POSTPUT 文件中的数据到端点,并将其保存到服务器上的文件中。我能找到的唯一示例以及其他问题中讨论的唯一方法是使用 multipart/form-data

以下“有效”,但 SHA256 哈希值通常不匹配,而作为 form-data 上传可以正常工作。

@application.route("/rupload/<filename>", methods=['POST', 'PUT'])
def rupload(filename):
    # Sanity checks and setup skipped.

    filename = secure_filename(filename)
    fileFullPath = os.path.join(UPLOAD_FOLDER, filename)

    with open(fileFullPath, 'wb') as f:
        f.write(request.get_data())

    return jsonify({
        'filename': filename,
        'size': os.path.getsize(fileFullPath)
    })

此外,上面的代码在内存方面非常低效。有没有办法通过某种类型的缓冲流将它写入输出文件?谢谢!

编辑:这就是我测试的方式:

curl -v -H 'Content-Type: application/octet-stream' -X POST --data @test.zip https://example.com/test/rupload/test.zip

编辑 --data-binary 没有区别。

最佳答案

问题可能出在您使用的 curl 命令上。手册页推荐 --data-binary:“这将完全按照指定的方式发布数据,无需任何额外处理。” --data 参数是--data-ascii 的同义词。可能不需要 -X 参数,因为它应该默认为 POST。

curl -v -H 'Content-Type: application/octet-stream' -X POST --data-binary @test.zip https://example.com/test/rupload/test.zip

request.get_data 上还有其他选项如果它们在某处被覆盖,调用可能会有所帮助。但看起来应该在服务器端工作。禁用缓存功能可能特别有利于您的用例。

f.write(request.get_data(cache=False, as_text=False, parse_form_data=False))

如果是服务器端,您可能需要更深入地研究 Werkzeug get_input_stream这是提供请求对象的内容。

curl 命令将内容类型 header 用作“application/octet-stream”,这很好。在这种情况下,Flask 似乎没有对此做任何事情,但它可以帮助更普遍地使用代理或其他情况下的数据。

关于高效处理大文件,您可能需要查看 request stream property ,这是 get_data 在内部用来读取数据的内容。

关于python - 在没有 multipart/form-data 的 Flask 中 ReSTfully 上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36901809/

相关文章:

java - "UNAVAILABLE"从android客户端到python服务器的gRPC失败

Python:如何显示对话框窗口并同时工作

python - 如何防止 LIKE '%input%' 子句中的 SQL 注入(inject)?

python - mysql - 修复错误 "TypeError: ' long' 对象不可迭代”

python - Peewee - 无法连接到主机上的 MySQL 服务器

python - 如何从父表单中删除字段?

python - Apache mod_wsgi : PermissionError when trying to access a page

java - 将 ZipInputStream 作为 Jax-RS 响应对象返回

c# - 来自 WCF 服务的 HttpWebRequest 失败并显示 - 请求已中止 : Could not create SSL/TLS secure channel

java - REST API 的响应以及请求执行期间生成的日志