python - 覆盖具有相同名称的图像 - 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'
我想我错误地覆盖了文件并且另一个实例仍然打开,为了解决它,我需要在覆盖之前正确关闭图像。我尝试这样做,但没有成功。
解决方案
通过信号接收和处理是很有趣的。在某些情况下,它可能比 更方便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
推荐阅读
- arrays - 从R中至少有最小差异的数组中选择随机元素的最佳方法
- c# - 覆盖 OnFormclosure 方法
- oracle - 在 Oracle PL sql 中获取 hh:mm:ss 格式后的子字符串
- unit-testing - JUnit 测试用例:java.lang.NullPointerException
- json - 从地图列表中修改 json 值并保存输出
- ruby-on-rails - Ruby 在脚本中插入 ENV[api_key]
- angular - 无法立即将数据从可观察对象中查看到 div 元素中
- react-native - 反应原生过滤器数据
- java - 使用 Hibernate Criteria 投影到列表字段
- constraints - 放大的容量限制