【问题标题】:URL shortening using UUID while serving files nginx django在提供文件 nginx django 时使用 UUID 缩短 URL
【发布时间】:2018-07-04 12:17:44
【问题描述】:

使用 Django2 和 nginx,用户可以上传文件(主要是图片、视频),我想通过屏蔽完整的 url 路径来提供这些文件。

这是我希望看到的示例结构,但我不希望用户知道这个结构甚至图像文件名。

domain.com/media/user/pictures/Y/M/D/image1.jpg

我希望用户通过这样的 url 看到上面的图像,并且每个文件的随机 UUID 编号发生变化,并且该编号可以指向任何类型的文件。

domain.com/media/23kj23l9ak3

上传文件时,原始名称、分配的权限(公共、朋友、私人)、文件路径和生成的 UUID 存储在数据库中),但文件存储在文件系统或远程位置。

我以前从未到过这一点,我想知道现代的做法是什么,或者让我知道 django/nginx 的哪些技术/功能可以帮助我解决它。

【问题讨论】:

  • 您尝试过任何现有的软件包吗?像 MicroURL 或 Url-Shortener ??
  • 我会检查出来的。

标签: django nginx


【解决方案1】:

我不完全确定您为什么要这样做,而不是简单地使用 UUID 作为上传文件的文件名,但您当然可以这样做。

一种好方法是通过 Django 路由请求,并使用自定义 X-Accel-Redirect 标头告诉 nginx 以特定文件响应。您需要将 UID 和实际路径都存储在 Django 模型中。所以 nginx 配置应该是这样的:

location /protected/ {
  internal;
  alias   /media/user/; # note the trailing slash
}

Django 视图将是:

def user_picture(request, uuid):
    image = MyModel.objects.get(uuid=uuid)
    response = HttpResponse(status=200)
    response['X-Accel-Redirect'] = '/protected/' + image.file.path
    return response

【讨论】:

  • 我喜欢你的说法,这很可能是解决方案,至少让我达到 99% 的目标。我现在无法实现它,但我会在几周后实现这一点。
  • Protip:如果您计算上传文件的 MD5 哈希并将其用作文件名而不是分配随机 UUID,那么您可以检测到多个用户上传同一文件并删除重复文件,因此您不会用任何重复的内容填满您的服务器
猜你喜欢
  • 2013-06-27
  • 2023-03-29
  • 1970-01-01
  • 2012-07-14
  • 2021-07-18
  • 2019-02-22
  • 2022-11-10
  • 2015-09-10
  • 1970-01-01
相关资源
最近更新 更多