You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django删除本地文件触发PermissionError(WinError32)问题求助

问题描述

我通过「先将文件上传至系统本地,再转存至Google Drive」的流程实现文件上传,之后立刻在同一进程中删除网站目录内的文件,但触发错误:Django PermissionError: [WinError 32] The process cannot access the file because it is being used by another process。我并未删除Google Drive上的文件,仅删除网站本地目录的文件。

相关代码

views.py

tfile = request.FILES['file']

temp = db.FileTemp(files=tfile)
temp.save()

media_metadata = {
  'name': str(tfile),
  'parents': [folder.objects.filter(user__username=user)[0].id_folder]
}
media = MediaFileUpload(os.path.join(temp.files.path), mimetype='image/jpeg', resumable=True)
upfile = drive.files().create(body=media_metadata, media_body=media, fields='id').execute()

user_permission = {
   'type': 'anyone',
   'role': 'reader',
}
perm = drive.permissions().create(fileId=upfile.get('id'), body=user_permission).execute()
link = drive.files().get(fileId=upfile.get('id'), fields='webViewLink').execute()

result['status'] = True
result['link'] = link['webViewLink']
            
temp.delete()

models.py

class FileTemp(models.Model):
    files = models.FileField(upload_to="file")

@receiver(post_delete, sender=FileTemp)
def foto_file_delete_handler(sender, **kwargs):
    filed = kwargs['instance']
    storage, path = filed.files.storage, filed.files.path
    storage.delete(path)
解决方案

错误核心原因是Google Drive的MediaFileUpload上传完成后未及时释放本地文件句柄,导致删除操作时文件仍被占用。可按以下方式修复:

  • 用上下文管理器读取文件上传:避免直接传递文件路径,改用with语句打开文件,确保上传后自动关闭文件句柄,修改views.py中的上传逻辑:

    # 替换原media创建及上传代码
    with open(temp.files.path, 'rb') as f:
        media = MediaFileUpload(f, mimetype='image/jpeg', resumable=True)
        upfile = drive.files().create(body=media_metadata, media_body=media, fields='id').execute()
    
  • 延迟删除(备选):如果上述方法无效,将删除操作放到后台任务(如Django Q、Celery)中执行,让当前进程先结束,再由后台进程处理文件删除,避开文件占用冲突。

内容的提问来源于stack exchange,提问作者Try To Up

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:48:09