当前位置: 首页 > 面试题库 >

使用flask(或烧瓶或类似容器)上传流文件

商柏
2023-03-14
问题内容

我有一个使用Python / Bottle编写的REST前端,用于处理文件上传,通常是大型文件上传。API的编写方式如下:

客户端发送带有文件作为有效负载的PUT。除其他外,它发送日期和授权标头。这是一种针对重放攻击的安全措施-
使用目标URL,日期和其他几项,使用临时密钥对请求进行分割

现在的问题。如果提供的日期在15分钟的给定datetime窗口中,则服务器接受请求。如果上传花费的时间足够长,它将比允许的时间增量更长。现在,使用瓶视图方法上的装饰器完成请求授权处理。但是,除非上载完成,否则Bottle不会启动分发过程,因此对于较长的上载,验证将失败。

我的问题是:是否有一种方法可以解释瓶子还是WSGI,以立即处理请求并随流传输上传内容?由于其他原因,这对我也很有用。或其他解决方案?在撰写本文时,我想到了WSGI中间件,但我仍然希望获得外部见解。

我愿意切换到Flask或其他Python框架,因为REST前端非常轻巧。

谢谢


问题答案:

我建议在前端将传入文件拆分为较小的块。我这样做是为了在Flask应用程序中为大型文件上传实现暂停/恢复功能。

使用Sebastian Tschan的jquery插件,您可以通过maxChunkSize在初始化插件时指定a来实现分块,如下所示:

$('#file-select').fileupload({
    url: '/uploads/',
    sequentialUploads: true,
    done: function (e, data) {
        console.log("uploaded: " + data.files[0].name)
    },
    maxChunkSize: 1000000 // 1 MB
});

现在,客户端在上传大文件时将发送多个请求。您的服务器端代码可以使用Content- Range标头将原始大文件重新修补在一起。对于Flask应用程序,视图可能类似于:

# Upload files
@app.route('/uploads/', methods=['POST'])
def results():

    files = request.files

    # assuming only one file is passed in the request
    key = files.keys()[0]
    value = files[key] # this is a Werkzeug FileStorage object
    filename = value.filename

    if 'Content-Range' in request.headers:
        # extract starting byte from Content-Range header string
        range_str = request.headers['Content-Range']
        start_bytes = int(range_str.split(' ')[1].split('-')[0])

        # append chunk to the file on disk, or create new
        with open(filename, 'a') as f:
            f.seek(start_bytes)
            f.write(value.stream.read())

    else:
        # this is not a chunked request, so just save the whole file
        value.save(filename)

    # send response with appropriate mime type header
    return jsonify({"name": value.filename,
                    "size": os.path.getsize(filename),
                    "url": 'uploads/' + value.filename,
                    "thumbnail_url": None,
                    "delete_url": None,
                    "delete_type": None,})

对于您的特定应用程序,您只需确保仍随每个请求发送正确的auth标头。

希望这可以帮助!我在这个问题上挣扎了一段时间;)



 类似资料:
  • 我试图上传一个图像约1.62MB到终端写使用flask.request.files对象总是空的。我检查了以下问题,但没有运气: 烧瓶request.files是空的 https://github.com/requests/requests/issues/2505 如何在烧瓶中使用ajax调用上传文件 这是我的服务器: 我的客户: 在我看来,一切都很干净,我不知道哪里出了问题。请求对象中的“文件”属

  • 问题内容: 已关闭 。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 改善这个问题 我正在开发一个允许设备在范围内时彼此识别的应用程序。为此,我正在使用iBeacon。 在下一步的开发中,我希望能够在范围内的任何设备之间发送“是”或“否”字符串-因此,连接到任何其他iBeacon的任何人都可以传达这些固定消息 由于i

  • 我想上传一个json文件在烧瓶restful swagger api,这是我的参数 我用 reqparse.####################################################################################### 解析器。添加参数('filename',type=str,location='args') parser.parse

  • 我基本上使用了install命令“$pip install Flask”,当我试图运行一个程序时,它会说“找不到模块”Flask安装在“/usr/local/lib/python2.7/site包”中,但我认为pip的意义在于,我可以到处导入这些包。我试图在我的桌面上运行一个文件,甚至当我将Flask文件夹移动到桌面上时,它也不起作用。有什么建议吗?谢谢

  • 问题内容: 我正在尝试使用Flask创建一个Web应用程序,该应用程序允许用户上传文件并将其提供给其他用户。现在,我可以将文件正确 地上 传到 upload_folder了 。但是我似乎找不到找到让用户下载回来的方法。 我将文件名的名称存储到数据库中。 我有一个为数据库对象服务的视图。我也可以删除它们。 在我的HTML中,我有: 和下载视图: 但它正在返回: 未找到 在服务器上找不到请求的URL。

  • 我正在使用Flask,并从get请求返回一个XML文件。如何将内容类型设置为xml? 例如。

  • 问题内容: 有没有办法用Flask接收多个上传的文件?我尝试了以下方法: 然后打印内容 如果我上传多个文件,它将仅打印该集中的第一个文件: 是否可以使用Flask的内置上传处理方式接收多个文件?谢谢你的帮助! 问题答案: 你可以使用flask.request.files的方法getlist,例如: