在Django中每次连续上传后删除媒体文件

时间:2014-12-15 21:31:18

标签: python django file-upload

我的目标是每次用户将文件上传到媒体文件夹时,删除先前的文件并替换为当前文件。基本上我一次只需要文件夹中的单个文件。我有一个工作示例,如果它包含相同的名称,则覆盖文件夹中的文件,我认为对它的简单修改会产生解决方案,但我已经能够正确地实现修改。

我必须覆盖重复的代码如下:

Models.py

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)

非常感谢有关修改或其他潜在解决方案的任何想法。

2 个答案:

答案 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)