2016-04-30 1 views
0

Dans l'un de mes projets django, j'essaie de télécharger des fichiers. Les fichiers peuvent être des fichiers vidéo et peuvent être gros comme 20 Mo. J'essaye de le télécharger avec la méthode de céleri et de upload_file_handler donnée dans des docs de django.Besoin d'un exemple de Django big Téléchargement de fichiers avec la méthode du gestionnaire de fichiers de téléchargement

Qu'est-ce que je l'ai fait.

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 

Dans 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'] 

Dans 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) 

Je suis coincé ici quoi faire après avoir appelé handled_uploaded_file. S'il vous plaît guidez-moi comment puis-je utiliser ce fichier écrit en utilisant hanldle_uploaded_file pour enregistrer dans le modèle django.

Répondre

0

Vous devrez retourner le chemin du fichier créé (par rapport à la racine/media) à partir de votre fonction handle_uploaded_file, puis l'enregistrer dans le champ vidéo du modèle.

donc quelque chose comme:

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

essayé, fonctionne très bien sur les marchés locaux. Merci. Mais il donne une erreur d'E/S sur le serveur appelé Aucun répertoire de ce type "" media /% s "% relative_chemin" n'existe. – user2534069

+0

Il semble que la racine du média sur votre serveur se trouve à un endroit différent. Est-ce que votre settings.py contient une entrée MEDIA_ROOT? Si oui, vous devriez utiliser cela comme base au lieu de "media /". Voir https://docs.djangoproject.com/en/dev/ref/settings/#media-root pour plus de détails. – georgeofallages

+0

Oui, vous aviez raison. MEDIA_ROOT pointait vers BASE_DIR + media – user2534069