如何使用烧瓶生成下载网址而不存储在服务器端? [复制]

Posted

技术标签:

【中文标题】如何使用烧瓶生成下载网址而不存储在服务器端? [复制]【英文标题】:How to generate a download url with flask without storing on server side? [duplicate] 【发布时间】:2019-03-26 10:14:26 【问题描述】:

所以,我正在尝试使用 Flask 制作一个简单的网络应用程序。我的应用程序将收到用户上传的图像并返回一个包含一些编辑图像的 zip(为该图像添加一些有趣的表情符号或类似的东西)。我的 zip 是用 Python 很好地创建的。我的问题是:在我完全生成该 zip 之后,如何生成该 zip 的下载 url?我认为将该 zip 存储在服务器端是不好的(只是我的客观想法),因为我的应用程序是公开的,我的意思是用户不必登录或注册,只需上传文件并接收 zip。

我试过搜索,有人推荐使用base64,有没有比这更好的方法?

【问题讨论】:

您可以生成一个链接并在上传后呈现给用户,这样只有知道该链接的用户才能下载压缩包 您的意思是将该 zip 以特定名称存储在服务器端,并为用户显示该 zip 的 url? 是的,像这样。您可以将其发送到 s3 或 FTP 服务器。将文件保存在服务器中你害怕什么? 因为我认为这些文件只使用一次,存储它有点浪费:D 【参考方案1】:

您可以在渲染期间直接创建 zip 文件。但是,请求时间会受到影响。

也许可以使用一种中间件,但我不能告诉你。

也许您会返回一个包含所请求图像地址的 JWT 令牌。根据请求,将创建 zip 存档。当然你也可以将图片地址作为 POST 或 GET 参数传递。

@app.route('/get-image')
def get_image():
  image_file = request.files['image_addr']

  # load and process image here
  image_data = ...

  # generate zip file 
  mem = io.BytesIO()
  mem.write(gzip.compress(image_data))
  mem.seek(0)
  return send_file(mem, as_attachment=True,
                     attachment_filename='archive.gzip',
                     mimetype='application/gzip')

这就是你要找的吗?

【讨论】:

很像这样,但如果你的代码应该用'request.files'替换request.form,用'mem'替换buffer,它对我有用。感谢您的帮助!

以上是关于如何使用烧瓶生成下载网址而不存储在服务器端? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何把服务器端生成的一个excel以链接的方式给客户端.

如何在两个模块之间共享数据库模型?

如何将网络摄像头帧从客户端发送到烧瓶服务器?

烧瓶下载文件

如何从烧瓶中调用另一个 web 服务 api

从烧瓶中的文件存储对象中提取文件