将图像上传到我们网站的 Windows 用户收到错误“WindowsError:[错误 32] 该进程无法访问该文件,因为它正被另一个进程使用”。
我很确定这与锁定 Windows (参见这个问题)有关,但我终其一生都无法弄清楚当我试图删除文件图像时,还有什么其他进程正在访问它!
这是导致错误的相关代码(错误被抛出shutil.rmtree(file_path)
)。提交文件后,在保存之前使用 PIL 调整它们的大小(参见 save() 代码)
模型.py
覆盖存储(我覆盖了)
class OverwriteStorage(FileSystemStorage): def get_available_name(self, name): file_path = os.path.dirname(os.path.join(MEDIA_ROOT, name)) if os.path.isdir(file_path): shutil.rmtree(file_path) return name
覆盖
Project
模型上的 save() 方法def save(self, force_insert=False, force_update=False, using=None, update_fields=None): for image_field in ({'name': 'photo', 'size': (208, 208), 'method': 'thumbnail'}, {'name': 'cover', 'size': (960, 300), 'method': 'crop'}): field = getattr(self, image_field['name']) if field: if field_has_changed(self, image_field['name']): image = Image.open(field.file) if image.mode not in ('L', 'RGB'): image = image.convert('RGB') if image_field['method'] == 'resize': image = image.resize(image_field['size'], Image.ANTIALIAS) elif image_field['method'] == 'crop': image = resize_and_crop(image, image_field['size'], crop_type='middle') else: image.thumbnail(image_field['size'], Image.ANTIALIAS) # Save the thumbnail temp_file = StringIO() image.save(temp_file, 'png') temp_file.seek(0) # Save to the thumbnail field suf = SimpleUploadedFile(os.path.split(field.name)[-1], temp_file.read(), content_type='image/png') field.save(suf.name.split('.')[0] + '.png', suf, save=False) # Save this photo instance super(Member, self).save( force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields)