首页 > 解决方案 > 如何使用 django 的 File 对象保存文件

问题描述

我正在使用 Celery 从上传的视频文件中删除音频。我想将音频文件保存到视频文件所在的模型中。所以这就是我正在尝试的:

# model
class Video(models.Model):
    file = models.FileField(
        validators=[
            FileExtensionValidator(
                allowed_extensions=["mp4", "mov", "flv", "mkv", "avi"]
            )
        ]
    )
    processed_file = models.FileField(
        validators=[FileExtensionValidator(allowed_extensions=["flac"])],
        null=True,
        blank=True,
    )

# celery task 
output_audio_file = str(settings.MEDIA_ROOT) + "/" + str(video_obj.pk) + ".flac"

ffmpeg.input(video_obj.file.path).output(
    output_audio_file,
    **{
        "ac": 1,
        "ar": 16000,
        "format": "flac",
    },
).run()

dj_file = File(open(output_audio_file))
video_obj.processed_file = dj_file
video_obj.save()

这引发了Detected path traversal attempt in '/app/proj/media/49.flac'异常。我还尝试了使用上下文管理器的video_obj.processed_file.save()方法。所有这些都加注TypeError, AttributeError, UnicodeDecodeError等等。我觉得答案可能很简单,但我就是找不到。

标签: pythondjango

解决方案


好吧,结果和我想的一样简单。由于 Django 将路径保存在数据库中,因此我只是给出了路径FileField,如下所示:

video_obj.processed_file.name = str(video_obj.pk) + ".flac"
video_obj.save()

我不需要,MEDIA_ROOT因为它是默认添加的。参考:https ://docs.djangoproject.com/en/3.2/topics/files/


推荐阅读