Python 在Django中每次成功上载后删除媒体文件

Python 在Django中每次成功上载后删除媒体文件,python,django,file-upload,Python,Django,File Upload,我的目标是,每次用户将文件上载到媒体文件夹时,都会删除上一个文件并将其替换为当前文件。实际上,我一次只希望文件夹中有一个文件。我有一个工作示例,如果文件夹中的文件包含相同的名称,则会覆盖该文件,我认为对其进行简单的修改将产生一个解决方案,但我无法正确实现修改 我必须覆盖重复项的代码如下: Models.py 如果您有任何关于修改或其他潜在解决方案的想法,我们将不胜感激。请这样做: class FileUpload(models.Model): docFile = models.FileF

我的目标是,每次用户将文件上载到媒体文件夹时,都会删除上一个文件并将其替换为当前文件。实际上,我一次只希望文件夹中有一个文件。我有一个工作示例,如果文件夹中的文件包含相同的名称,则会覆盖该文件,我认为对其进行简单的修改将产生一个解决方案,但我无法正确实现修改

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

Models.py 如果您有任何关于修改或其他潜在解决方案的想法,我们将不胜感激。

请这样做:

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

的东西,我在Django==3.2中使用Django文件系统存储来轻松删除媒体文件。您只需将要删除的文件的绝对路径传递到fs.delete(绝对路径)绝对路径也可以从fs.path(文件名)

从django.core.files.storage导入文件系统存储
img_file=request.FILES['file']
fs=文件系统存储()
filename=fs.save(img\u file.name,img\u文件)
上传的文件路径=fs.path(文件名)
""" 
现在你有了绝对路径
您可以随时将其传递给fs.delete(绝对路径)
要像这样删除特定的媒体文件,
"""
fs.delete(上传的文件路径)

看这里,也许我的问题措辞不当。我不需要每个文件都有一个唯一的名称,而是每次上载文件时,都会删除以前位于媒体文件夹中的文件。换言之,该文件夹中的文件不应超过1个,因为新上载的文件应始终覆盖该文件。如果您使用每个“记录”一个文件名(即使用记录pk),则每次上载都将覆盖现有文件。我很难理解您的意思。你能举个例子吗?我只做了一次编辑,但除此之外,你的代码工作得非常好。谢谢是的,忘了指定
rmtree
的路径。您还可以将目录放在特定的用户目录下,因为您可以访问
user
变量。如果您有更多的用户,请注意1)此代码不是线程安全的2)您不需要包装
wrapper()
,只需使用
models.FileField(upload\u=wrapper
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