Django中文件名重复时如何实现文件覆盖?
问题
当新上传文件的名称与已存在的上传文件名称相同时,如何实现文件覆盖?若通过获取file.name删除所有同名文件后再存储新文件,这种方式也可接受。以下是当前的view.py代码:
from django.shortcuts import render from django.views.generic import TemplateView from django.core.files.storage import FileSystemStorage from django.http import HttpResponse import requests from geopy.distance import geodesic as GD import pandas as pd from subprocess import run,PIPE from .forms import UploadFileForm from django.core.files.storage import FileSystemStorage def upload_file(request): if request.method == 'POST': form = UploadFileForm(request.POST, request.FILES) file = request.FILES['file'] fs = FileSystemStorage() fs.save(file.name, file) else: form = UploadFileForm() return render(request, 'upload.html', {'form':form})
解决方法
方法一:直接开启FileSystemStorage的覆盖模式
Django的FileSystemStorage默认不会覆盖同名文件,会自动给新文件重命名(比如file.txt变成file_1.txt)。你可以在初始化FileSystemStorage时设置file_overwrite=True,调用save方法时就会直接覆盖已存在的同名文件:
修改后的代码:
def upload_file(request): if request.method == 'POST': form = UploadFileForm(request.POST, request.FILES) file = request.FILES['file'] # 初始化时开启文件覆盖模式 fs = FileSystemStorage(file_overwrite=True) fs.save(file.name, file) else: form = UploadFileForm() return render(request, 'upload.html', {'form':form})
方法二:先删除同名文件再保存
如果你更倾向于先删除已存在的同名文件再保存新文件,可以用FileSystemStorage的exists方法判断文件是否存在,若存在则调用delete方法删除,之后再保存新文件:
修改后的代码:
def upload_file(request): if request.method == 'POST': form = UploadFileForm(request.POST, request.FILES) file = request.FILES['file'] fs = FileSystemStorage() # 检查文件是否存在,存在则删除 if fs.exists(file.name): fs.delete(file.name) # 保存新文件 fs.save(file.name, file) else: form = UploadFileForm() return render(request, 'upload.html', {'form':form})
额外优化:添加表单验证
建议在代码中加入表单验证逻辑,确保上传的表单有效:
def upload_file(request): if request.method == 'POST': form = UploadFileForm(request.POST, request.FILES) # 新增表单验证 if form.is_valid(): file = request.FILES['file'] fs = FileSystemStorage(file_overwrite=True) fs.save(file.name, file) # 可在此添加上传成功后的提示或跳转逻辑 else: form = UploadFileForm() return render(request, 'upload.html', {'form':form})
内容的提问来源于stack exchange,提问作者Joshua
相关产品推荐
相关产品推荐

