首页 > 解决方案 > 覆盖具有相同名称的图像 - Django

问题描述

通过我的项目,我让用户上传个人资料图片。我将个人资料图片保存为 userID.jpg。如果他们上传新的头像,我想覆盖旧的头像,这样我就不会浪费存储空间。通过浏览之前关于 stackoverflow 的问题,我重新定义了 OverwriteStorage:

class OverwriteStorage(FileSystemStorage):
    def get_available_name(self, name, max_length=None):
        if self.exists(name):
             os.remove(os.path.join(settings.MEDIA_ROOT, name))
        return name

当我上传头像时,在我电脑的目录中可以看到图片已经被覆盖成功。图片保存路径为“media/profile/userID.jpg”。但是,当我在我的网站上显示图像时,它仍然是旧图片。通过django站点,当我打开路径时,我看到了旧图,当我尝试通过admin更改它时,我得到以下错误:

[WinError 32] The process cannot access the file because it is being used by another process: '\media\\profile\\userID.jpg'

我想我错误地覆盖了文件并且另一个实例仍然打开,为了解决它,我需要在覆盖之前正确关闭图像。我尝试这样做,但没有成功。

标签: pythondjangooverwrite

解决方案


通过信号接收和处理是很有趣的。在某些情况下,它可能比 更方便OverwriteStorage(FileSystemStorage)

但是,os.remove(filename)没有本地文件系统是不安全/工作的。我推荐使用Django File Storage API

from django.core.files.storage import default_storage

os.path.isfile(path)  # worse
default_storage.exists(path)  # better

os.remove(path)  # worse
default_storage.delete(path)  # better

推荐阅读