使用django上传多个图像,同时为每个图像保留唯一的文件名和日期时间

时间:2012-08-21 10:33:03

标签: django datetime

所以我做了一个画廊网页,支持一次上传几张图片。问题是我已经做到这一点,以便上传的任何图像都有一个文件名,如[用户名] _ [unix timestamp] .jpg

查看所有上传的图像时,图像按日期排序。最初这是上传大量图片时的一个问题,因为它们都有非常相似的日期时间戳。下到同一秒。我使用get_next_by_date()和get_previous_by_date()来浏览图像,当许多图像存储到同一秒时,这种方法效果不佳。

另一个问题是,由于图像处理以每秒通常三个图像的速度完成,因此三个和三个图像获得相同的unix时间戳。这导致第一个在第二个处理的图像在网站上被代表三次,而不是在同一秒后处理的其他图像。 (操作系统在发现名称已被删除时为文件指定了不同的名称,但数据库仍将原始时间戳存储到文件名中。)

到目前为止,我通过在处理每个图像后弹出time.sleep(1)来“修复”问题,以确保为每个图像启动新的第二个,但这只会让我感觉很糟糕。然后,要上传的60张图像需要花费60秒,而不应超过10-20秒。

有人能想到解决这个问题吗?如何确保按日期排序的图像在查看图像时能够获得正确的序列,并且unix时间戳对于所有图像都是唯一的?

3 个答案:

答案 0 :(得分:1)

最安全的方法是在文件名中添加一个哈希值。这也可以防止攻击者猜测你的文件名,这通常是一件好事。

def upload_to_name(instance, filename):
    name = hashlib.sha1(str(instance.id) + str(random.random())).hexdigest()
    return 'path_to_the_folder/%s.%s' % (path, name, filename.split('.')[-1])

答案 1 :(得分:0)

为时间戳添加毫秒。如果它没有帮助 - 将图像哈希添加到文件名。

答案 2 :(得分:0)

您也可以使用毫秒从时间戳创建文件名。

使用毫秒strftime为文件名创建字符串:

>>>import datetime from datetime
>>>date1=datetime.utcnow()
>>>date1.strftime("%Y_%m_%d_%H_%M_%S_%f")
'2012_08_21_05_55_25_302249'