2016-04-30 63 views
0

在我的一個django項目中,我試圖上傳文件。文件可以是視頻文件,可以大到20 MB。我正在嘗試使用django文檔中提供的celery和upload_file_handler方法來上傳它。需要Django大文件的例子上傳文件處理器方法

我做了什麼。

class MyVideo(models.Model): 
    user = models.ForeignKey(User) 
    video = models.FileField(null=True, blank=True, upload_to="video") 

    def __unicode__(self): 
     return self.user.username 

在forms.py

class VideoForm(forms.ModelForm): 
    video = forms.FileField(required=False) 

    class Meta: 
     model = MyVideo 
     exclude = ['user'] 

    def clean_video(self): 
     video = self.cleaned_data['video'] 
     if video and video._size > (10 * 1024 * 1024): 
      raise forms.ValidationError("only 10 MB video is allowed") 
     return self.cleaned_data['video'] 

在View.py

class CreateDigitalAssetsView(LoginRequiredMixin, CreateView): 

template_name = "video_create.html" 
form_class = VideoForm 

def get_success_url(self): 
    return reverse("video_url") 

def form_valid(self, form): 
    user = self.request.user 
    video = form.cleaned_data['video'] 

    if video: 
     handle_uploaded_file(video) 
     # stick here what to do next. 

def handle_uploaded_file(f): 
    filename, extension = os.path.splitext(video.name) 
    with open('media/video/'+filename, 'wb+') as destination: 
     for chunk in f.chunks(): 
      destination.write(chunk) 

我在這裏堅持呼籲handled_uploaded_file後下一步要做什麼。請指導我如何使用hanldle_uploaded_file保存在django模型中的這個書面文件。

回答

0

您需要從handle_uploaded_file函數返回創建的文件的路徑(相對於/ media根目錄),然後將其保存到模型的視頻字段。

因此,像:

def handle_uploaded_file(f): 
    filename, extension = os.path.splitext(video.name) 
    relative_path = "video/%s" % filename 
    full_path = "media/%s" % relative_path 
    with open(full_path, 'wb+') as destination: 
    for chunk in f.chunks(): 
     destination.write(chunk) 
    return relative_path 

def form_valid(self, form): 
    ... 

    if video: 
     relative_path = handle_uploaded_file(video) 
     form.instance.video = relative_path 
     form.instance.save() 
+0

想這一點,工作細地方。謝謝。但它在服務器上發出IO錯誤,稱爲「沒有這樣的目錄'」media /%s「%relative_path'存在。 – user2534069

+0

服務器上媒體根目錄的聲音位於不同的位置。您的settings.py包含MEDIA_ROOT條目嗎?如果是這樣,你應該使用它作爲基礎,而不是「媒體/」。有關詳細信息,請參閱https://docs.djangoproject.com/en/dev/ref/settings/#media-root。 – georgeofallages

+0

是的,你說得對。 MEDIA_ROOT指向BASE_DIR +媒體 – user2534069