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

使用django上载多个图像,同时为每个图像保留唯一的文件名和日期时间,django,datetime,Django,Datetime,所以我制作了一个画廊网页,支持一次性上传多张图片。问题是,我这样做是为了让上传的任何图像都有一个文件名,比如[username]u[unix timestamp].jpg 查看所有上载的图像时,图像按日期排序。最初上传很多图片时会出现问题,因为它们都有非常相似的日期戳。降到同一秒。我使用get_next_by_date()和get_previous_by_date()浏览图像,当许多图像存储到同一秒时,这项功能无法正常工作 另一个问题是,由于图像处理的速度通常为每秒三个图像,因此三个和三个图像获

所以我制作了一个画廊网页,支持一次性上传多张图片。问题是,我这样做是为了让上传的任何图像都有一个文件名,比如[username]u[unix timestamp].jpg

查看所有上载的图像时,图像按日期排序。最初上传很多图片时会出现问题,因为它们都有非常相似的日期戳。降到同一秒。我使用get_next_by_date()和get_previous_by_date()浏览图像,当许多图像存储到同一秒时,这项功能无法正常工作

另一个问题是,由于图像处理的速度通常为每秒三个图像,因此三个和三个图像获得相同的unix时间戳。这导致在一秒钟内第一次处理的同一图像在站点上显示三次,而不是在同一秒钟后处理的其他图像。(当操作系统发现文件名已被取下时,给了文件一个不同的名称,但数据库仍将原始时间戳存储到文件名中)

到目前为止,我已经通过弹出一个时间来“修复”这个问题。在处理每个图像后进行睡眠(1),以保证为每个图像启动一个新的秒,但这只会让我感觉很糟糕。上传60张图片保证需要60秒,而不需要超过10-20秒


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

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

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

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

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

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

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

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

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

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

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])

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

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])

谢谢,我喜欢这个主意。但是,这是否有可能会导致数据库中当前日期时间字段中没有毫秒的所有图像出现问题?@GeirK.H.,我不这么认为。您可以使用此功能在
upload_to
函数中创建文件名。所以从现在起,新文件的文件名将以毫秒为单位。现有文件的路径已经存储在DB中,DB不会更改,因此它们可以工作。但是,请验证!关于文件名,我认为你是对的,但主要问题是datetime字段。我不知道我是否说得足够清楚,但有一个“日期”字段和一个“文件名”字段,其中文件名恰好是由unix时间戳建立的。然而,“日期”字段到目前为止是YYY-MM-DD-HH-MM。我只是担心,当当前观看一张没有毫秒的图片时,下一张图片将有毫秒,如果这可能会导致使用“get_next_by_date()”时出现某种不匹配,我只会尝试一下,看看会发生什么。我将报告我的发现:)我还没有实现这一点,但是我的一位非常擅长Django的同事确认这应该可以工作,但是其他datetime字段应该修改以匹配新的结构(例如,包括毫秒)。这也应该可以做到没有太多模糊,所以我接受你的解决方案,即使我还没有尝试:)谢谢。谢谢,我喜欢这个想法。但是,这是否有可能会导致数据库中当前日期时间字段中没有毫秒的所有图像出现问题?@GeirK.H.,我不这么认为。您可以使用此功能在
upload_to
函数中创建文件名。所以从现在起,新文件的文件名将以毫秒为单位。现有文件的路径已经存储在DB中,DB不会更改,因此它们可以工作。但是,请验证!关于文件名,我认为你是对的,但主要问题是datetime字段。我不知道我是否说得足够清楚,但有一个“日期”字段和一个“文件名”字段,其中文件名恰好是由unix时间戳建立的。然而,“日期”字段到目前为止是YYY-MM-DD-HH-MM。我只是担心,当当前观看一张没有毫秒的图片时,下一张图片将有毫秒,如果这可能会导致使用“get_next_by_date()”时出现某种不匹配,我只会尝试一下,看看会发生什么。我将报告我的发现:)我还没有实现这一点,但是我的一位非常擅长Django的同事确认这应该可以工作,但是其他datetime字段应该修改以匹配新的结构(例如,包括毫秒)。这在没有太多模糊的情况下也是可能的,所以我接受你的解决方案,尽管我还没有尝试:)谢谢。