ove*_*lii 0 django django-rest-framework
我有一个带有Django Rest Framework的API端点来上传图像.
class MyImageSerializer(serializers.ModelSerializer):
image = serializers.ImageField(source='image')
Run Code Online (Sandbox Code Playgroud)
我可以上传图像,但它们使用从客户端发送的文件名保存,这可能导致冲突.我想改为使用时间戳文件名将文件上传到我的CDN.
生成文件名不是问题,只是用它保存图像.
谁知道怎么做?谢谢.
如果您的图片类型的ImageField从Django中,那么你真的没有做任何事情,甚至在你的串行声明它像你这样.将它添加到fields属性中就足够了,django将处理冲突.这意味着django会在每个可能产生冲突的新文件上添加_index,所以如果你上传一个名为'my_pic.jpg'的文件5次,你实际上会有文件'my_pic.jpg','my_pic_1.jpg','my_pic_2您的服务器上有.jpg','my_pic_3.jpg','my_pic_4.jpg'.
现在,这是使用django的FileSystemStorage实现(请参见此处)完成的,但如果您希望它为您的文件名附加时间戳,您所要做的就是编写一个存储类来覆盖get_available_name(name)方法.例:
class MyFileSystemStorage(FileSystemStorage):
def get_available_name(self, name):
''' name is the current file name '''
now = time.time()
stamp = datetime.datetime.fromtimestamp(now).strftime('%Y-%m-%d-%H-%M-%S')
return '{0}_{1}'.format(name, str(stamp))
Run Code Online (Sandbox Code Playgroud)
以及模型中的图像字段:
image = models.ImageField(upload_to='your upload dir', storage= MyFileSystemStorage)
Run Code Online (Sandbox Code Playgroud)
截至2014年8月20日,这不再是一个问题,因为Django发现了与此行为相关的漏洞(感谢@mlissner指出它).重要摘录:
如果已存在具有上载名称的文件,我们通过更改生成文件名的算法来解决该问题.Storage.get_available_name()现在附加下划线加上一个随机的7个字符的字母数字字符串(例如"_x3a1gho"),而不是迭代下划线后跟一个数字(例如"_1","_ 2"等).
| 归档时间: |
|
| 查看次数: |
1141 次 |
| 最近记录: |