【问题标题】:Delete a media file after each succesive upload in Django在 Django 中每次连续上传后删除一个媒体文件
【发布时间】:2015-02-14 02:34:59
【问题描述】:

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

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

模型.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)

任何关于修改或其他潜在解决方案的想法将不胜感激。

【问题讨论】:

  • 也许我的问题措辞不佳。我不需要每个文件都有一个唯一的名称,而是每次上传文件时都会删除以前在媒体文件夹中的文件。换句话说,该文件夹中的文件不应该超过 1 个,因为它应该总是被新上传的文件覆盖。
  • 如果您对每个“记录”使用一个文件名(即使用记录 pk),则每次上传都会覆盖现有文件
  • 我很难理解你的意思。你能举个例子吗?

标签: python django file-upload


【解决方案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

【讨论】:

  • 我进行了一次编辑,但除此之外,您的代码运行良好。谢谢!
  • 是的,忘记指定rmtree 的路径。您还可以将目录放在特定的用户目录下,因为您可以访问 user 变量。如果您有更多用户
  • 请注意 1) 这段代码不是线程安全的 2) 你不需要包装你的 wrapper() 只需使用 models.FileField(upload_to=wrapper)
【解决方案2】:

我设法在 Django==3.2 中使用 Django FileSystemStorage 轻松删除了一个媒体文件。您只需将要删除的文件的绝对路径传递给 fs.delete(absolute_path) 绝对路径也可以从 fs.path(filename)

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2022-10-21
    • 2014-03-23
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    相关资源
    最近更新 更多