【发布时间】:2019-07-03 10:22:12
【问题描述】:
我正在使用 Django+DRF 来允许上传/保留/服务用户上传的资产文件。我需要让用户稍后下载上传的资产。在文件上传时,我需要对其真实名称进行 md5-hash 并将其保存到文件系统中,并以该哈希作为文件名。然后,当用户想在 FE 上下载/查看它时,假设他上传了一个文件“cute_cat.jpg”,我希望他获取名为“cute_cat.jpg”的文件而不是 3c808e77fc1b0aee4435533690be458d(名称是一个问题,另一个一种是浏览器将不带扩展名的文件作为 application/octet-stream 提供,我希望它将“.jpg”(最初)文件呈现为图像)
我觉得我需要注入一个带有 'Content-Disposition: attachment; 的 HTTP 标头; filename=cute_cat.jpg'(我将真实文件名存储在 DB 中)在通往 DRF 的 Response() 途中的某个地方,但我不确定在什么时候我要这样做,即使它是可能的...... 我尝试了很多东西,主要是为序列化程序实现自定义字段并在那里注入一个自定义 URL,但显然这不是办法,因为没有地方可以将标头注入到文本 URL 并且尝试输出一个没有意义API 视图中带有标头的请求对象...
这是我的模型:
def get_full_path(instance, filename):
return '/'.join([
instance.user.name,
hashlib.md5(filename.encode()).hexdigest()
])
class CustomAsset(models.Model):
file = models.FileField(blank=False, null=False, upload_to=get_full_path)
real_file_name = models.CharField(max_length=255, blank=False, null=False)
user = models.ForeignKey(...)
序列化程序/API 视图中没有任何内容被覆盖。
非常感谢。
【问题讨论】:
-
这里的 FE 是什么?
-
FE=前端,BE=后端
标签: django django-rest-framework