簡體   English   中英

將新文件上傳到模型文件字段

[英]Upload new file to the model filefield

我有一個視頻模型

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('/')

最后, task.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文件路徑(是轉換后的視頻,位於項目的基本目錄中)的值,但沒有上傳新的文件到指定的路徑。

如何上傳新的轉換后的文件中的的FileField mp4_720與上傳的路徑?

謝謝

1. upload_to保存相對於您的MEDIA_ROOT圖像( 參考 )。 而且僅當您使用表單上傳文件時才有效,但是在這里,您是手動設置video.mp4_720

2.在轉換視頻時,應將輸出保存在MEDIA_ROOT中(應提供絕對url),但僅提供文件名,請修改代碼:

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

我希望這能解決您的問題。 我必須測試代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM