我的目标是每次用户将文件上传到媒体文件夹时,删除先前的文件并替换为当前文件。基本上我一次只需要文件夹中的单个文件。我有一个工作示例,如果它包含相同的名称,则覆盖文件夹中的文件,我认为对它的简单修改会产生解决方案,但我已经能够正确地实现修改。
我必须覆盖重复的代码如下:
class OverwriteStorage(FileSystemStorage):
def get_available_name(self, name):
if self.exists(name):
os.remove(os.path.join(settings.MEDIA_ROOT, name))
return name
class FileUpload(models.Model):
docFile = models.FileField(upload_to='Data_Files', storage=OverwriteStorage(), blank=True)
def __str__(self):
return self.docfile.name
@property
def filename(self):
return os.path.basename(self.docFile.name)
非常感谢有关修改或其他潜在解决方案的任何想法。
答案 0 :(得分:1)
这样做:
class FileUpload(models.Model):
docFile = models.FileField(upload_to=path_file())
以下是处理上传的功能:
def path_file():
def wrapper(user, filename):
file_upload_dir = os.path.join(settings.MEDIA_ROOT, 'file_upload')
if os.path.exists(file_upload_dir):
import shutil
shutil.rmtree(file_upload_dir)
return os.path.join(file_upload_dir, filename)
return wrapper
你去吧。所以这个想法很简单。上传的任何文件都将到达定义良好的目录。每次上传发生时删除并重新创建此目录
我还建议您将上传文件的名称重命名为您想要的任何名称。像single_file.extension
答案 1 :(得分:0)
我设法在 Django==3.2 中使用 Django FileSystemStorage 轻松删除了媒体文件。您只需要将要删除的文件的绝对路径传入fs.delete(absolute_path) 绝对路径也可以很容易地从fs.path(filename)< /strong>
from django.core.files.storage import FileSystemStorage
img_file = request.FILES['file']
fs = FileSystemStorage()
filename = fs.save(img_file.name, img_file)
uploaded_file_path = fs.path(filename)
"""
now that you have the absolute path
you can just pass this to fs.delete(absolute_path) anytime
to delete that particular media file like so,
"""
fs.delete(uploaded_file_path)