【问题标题】:Uploading Files in Django - How to avoid the increase of files in the upload directory在Django中上传文件-如何避免上传目录中文件的增加
【发布时间】:2018-08-04 03:52:17
【问题描述】:

我一直致力于在 Django 上上传文件。我有以下代码来运行。

def handle_uploaded_file(file, filename):
    if not os.path.exists('upload/'):
        os.mkdir('upload/')

    with open('upload/' + filename, 'wb+') as destination:
        for chunk in file.chunks():
            destination.write(chunk)

def upload_csv(request):
    # Get the context from the request.
    context = RequestContext(request)

    if request.is_ajax():
        if "POST" == request.method:
            csv_file = request.FILES['file']
            my_df = pd.read_csv(csv_file, header=0)
            handle_uploaded_file(csv_file, str(csv_file))
            .............................
            .............................              

正如你在上面看到的,我一直在上传文件到上传目录。但是,我担心这种方法可能效率不高,因为每个文件都保存并存储在该文件夹中。如果每周上传数百或数千个文件怎么办?看到这个:

高效上传文件的其他方法是什么?

【问题讨论】:

  • 唯一真正关心的是您的硬件;磁盘(或网络)速度可能会影响性能,并且您需要足够的存储空间。像 Apache 或 IIS 这样的网络服务器应该为您的静态和上传内容提供服务。他们可以有效地处理它。如果您真的需要卸载这项工作,您也可以使用 AWS S3 存储。

标签: django python-3.x file-upload


【解决方案1】:

将上传的文件存储在磁盘上被认为是最佳做法。 没有办法。您必须在服务器上提供足够的磁盘空间。此外,如果您的磁盘空间不足,您可以自动阻止上传。

永远不应该在数据库中存储文件。如果它正在 被认为是解决问题的方法,找到经过认证的数据库 专家并征求第二意见。

来源:Two Scopes of Django


如果您担心file limit within a folder,您可以将子文件夹引入您的upload 目录。例如upload/category/year/filename。您可以利用FileField

def document_directory_path(instance, filename):
    path = 'upload/{}/%Y/{}'.format(instance.category.slug, filename)
    return datetime.datetime.now().strftime(path)


class Document(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    file = models.FileField(upload_to=document_directory_path)

    def filename(self):
        return os.path.basename(self.file.name)

可以在here 找到另一个按用户(上传者)ID 对您的上传进行分组的类似示例。


最后但并非最不重要的一点是,您可以选择迁移到云提供商。如果您期望有数千个文件和大量流量,这可能会很昂贵。

【讨论】:

  • 感谢您的回答 Yannic。您不认为最好编写一个服务程序(用于 Windows 服务器的 Windows 服务或用于 linux 的 cron 作业)来删除该文件夹下的文件吗?比如那种小服务程序,每天都可以删除所有昨天的文件。
  • 如果您的项目中没有像 celery 这样的异步任务队列,我会选择 cron 工作。相当于它是一个 windows 计划任务(不是 windows 服务)。
  • 是的,我申请了this,它成功了。再次感谢 Yannic。
猜你喜欢
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 2017-08-18
相关资源
最近更新 更多