0

将图像上传到我们网站的 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)
    
4

0 回答 0