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
相关产品推荐
相关产品推荐

