Django:如何创建文件目录,将文件上传到该目录,访问该文件进行计算,并存储以供下载?

Django: How to create file directory, upload file into that directory, access that file for calculation, and store it for download?

我正在制作一个 Django 项目,让特定用户可以:

* first, upload a file with specified file-type;
* second, use that file to perform some calculations; and
* third, provide a derivative file for download.

然后用户可以查看已上传的所有文件的列表,包括其他用户上传的文件,并选择要下载或删除的文件。

我做了一个应用程序来管理用户的帐户,另一个应用程序(核心)用于文件上传和计算。现在我想把上传的文件存放在一个特定的目录中,这样我就可以方便地访问文件进行数据检索。

我试过这样做:

core_app/models.py

def file_path_dir(instance, filename):
    return 'files/{0}/{1}'.format(instance.id, filename)

class Core(models.Model):

    id = models.AutoField(primary_key=True, editable=False)
    date_created = models.DateField(auto_now_add=True)
    user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    csv = models.FileField(upload_to=file_path_dir,
                validators=[FileExtensionValidator(allowed_extensions=['csv'])])  # NOT SAFE 

在这里,我希望使用将存储在数据库中的 id 将文件上传到目录中。但是,文件存储在这个目录中 - files/None/filename.

我不知道为什么当我成功将文件保存到数据库中时它显示 'None'(使用 postgresql)。我需要有关如何解决此问题或如何正确执行此操作以使其正常工作的帮助。

此外,我想知道验证文件扩展名的最安全/更可靠的方法。

file_path_dir 在数据库端实际保存发生之前被调用。您正在使用的 id 尚未创建,因为尚未调用保存功能。

为了获得 id,您需要将实例和文件保存在一个临时文件夹中,然后在从数据库中获得 id 后移动它。

但更好的方法是使用其他东西代替 id。您可以改用月、日甚至年,如果您真的需要每个文件目录都有独特的东西,您可以添加一个独特的字段,如额外的 id 或 slug,然后自己生成并使用它。

关于验证文件扩展名的第二个问题:

第一步是检查您已经在做的格式,它通常足够安全,具体取决于平台。但是如果您需要更高的安全性,您可以在安全的环境中读取该文件并查看它是否符合该类型扩展名的规则。或者您可以使用其他应用程序为您执行此操作并在后台使用它们。