【问题标题】:Upload new file to the model filefield将新文件上传到模型文件字段
【发布时间】:2015-10-27 10:31:34
【问题描述】:

我有一个视频模型

class Video(models.Model):
    title = models.CharField(max_length=75)
    pubdate = models.DateTimeField(default=timezone.now)
    original_video = models.FileField(upload_to=get_upload_file_name)
    mp4_720 = models.FileField(upload_to=get_upload_file_name,blank=True, null=True)
    converted = models.BooleanField(default=False)

这是 views.py

def upload_video(request):
    if request.POST:
        form = VideoForm(request.POST, request.FILES)
        if form.is_valid():
            video = form.save(commit=False)
            video.save()
            convert_video.delay(video.id)
            return HttpResponseRedirect('/')

最后是 tasks.py

def get_upload_file_name(video):
    name = video.title
    name = name+'.mp4'
    return name

from pyvid.settings import MEDIA_ROOT
@app.task
def convert_video(video_id):
    video = Video.objects.get(id=video_id)
    video_path = str(MEDIA_ROOT)+'/'+str(video.original_video)
    convert_video_name = get_upload_file_name(video)
    cmd = 'ffmpeg -i %s -codec:v libx264 -profile:v baseline -preset slow -b:v 250k -maxrate 250k -bufsize 500k -vf scale=-1:360 -threads 0 -codec:a libfdk_aac -movflags +faststart %s.mp4' % (video_path, convert_video_name)
    subprocess.call(
        cmd,
        shell=True
    )
    video.mp4_720 = convert_video_name
    video.converted = True
    video.save()

问题是,即使video.mp4_720是通过upload_to=get_upload_file_name()上传的,它只是取convert_video_name文件路径的值(即转换后的视频,在项目的基本目录中),而不是上传新文件到指定的路径。

如何将转换后的新文件上传到mp4_720的filefield中,并附上上传的路径?

谢谢

【问题讨论】:

    标签: python django django-file-upload


    【解决方案1】:

    1.upload_to 保存相对于您的MEDIA_ROOT (ref) 的图像。 只有当您使用表单上传文件时,此功能才有效,但在这里,您手动设置 video.mp4_720

    2.在转换视频时,您应该将输出保存在 MEDIA_ROOT 中(您应该提供绝对网址)但您只是提供文件名, 修改你的代码:

    video_path = str(MEDIA_ROOT)+'/'+str(video.original_video)
    convert_video_name = get_upload_file_name(video)
    output_path = MEDIA_ROOT + '/' + convert_video_name
    cmd = 'ffmpeg -i %s -codec:v libx264 -profile:v baseline -preset slow -b:v 250k -maxrate 250k -bufsize 500k -vf scale=-1:360 -threads 0 -codec:a libfdk_aac -movflags +faststart %s.mp4' % (video_path, output_path)
    
    1. 如果您手动设置 FileField,您应该提供与您的MEDIA_ROOT 相关的文件路径。现在您的代码应该像声明 video.mp4_720 = convert_video_name 已经相对于 MEDIA_ROOT 那样工作。

    我希望这能解决您的问题。我必须测试代码。

    【讨论】:

      猜你喜欢
      • 2011-03-12
      • 2016-11-10
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      • 2020-02-05
      相关资源
      最近更新 更多