2016-06-05 10 views
1

Ich arbeite an einem Web. User kann eine Datei hochladen. Diese Datei befindet sich im Format docx. Nachdem er eine Datei hochgeladen hat und auswählt, in welche Sprachen er die Datei übersetzen möchte, möchte ich ihn auf eine andere Seite umleiten, wo er Preise für Übersetzungen sehen kann. Die Preise hängen von der jeweiligen Sprache und Anzahl der Zeichen in der Datei docx ab.Wie kann man nach dem Upload in Django auf die Datei zugreifen?

Ich kann nicht herausfinden, wie mit der hochgeladenen Datei umzugehen. Ich habe eine Funktion, die den Pfad zur Datei abruft und eine Anzahl von Zeichen zurückgibt. Nach dem Hochladen der Datei und dem Klicken auf "Senden" möchte ich diese Funktion aufrufen, damit ich eine neue Seite mit geschätzten Preisen rendern kann.

Ich habe gelesen, dass ich temporary_file_path auf request.FILES['file'] nennen können, aber es wirft

‚InMemoryUploadedFile‘ Objekt hat kein Attribut ‚temporary_file_path‘

Ich möchte herausfinden, wie viele Zeichen Datei hochgeladen enthält und sendet es in einer Anfrage an eine andere Ansicht - /order-estimation.

VIEW:

def create_order(request): 
    LanguageLevelFormSet = formset_factory(LanguageLevelForm, extra=5, max_num=5) 
    language_level_formset = LanguageLevelFormSet(request.POST or None) 
    job_creation_form = JobCreationForm(request.POST or None, request.FILES or None) 

    context = {'job_creation_form': job_creation_form, 
       'formset': language_level_formset} 

    if request.method == 'POST': 
     if job_creation_form.is_valid() and language_level_formset.is_valid(): 
      cleaned_data_job_creation_form = job_creation_form.cleaned_data 
      cleaned_data_language_level_formset = language_level_formset.cleaned_data 
      for language_level_form in [d for d in cleaned_data_language_level_formset if d]: 
       language = language_level_form['language'] 
       level = language_level_form['level'] 

       Job.objects.create(
         customer=request.user, 
         text_to_translate=cleaned_data_job_creation_form['text_to_translate'], 
         file=cleaned_data_job_creation_form['file'], 
         short_description=cleaned_data_job_creation_form['short_description'], 
         notes=cleaned_data_job_creation_form['notes'], 
         language_from=cleaned_data_job_creation_form['language_from'], 
         language_to=language, 
         level=level, 
       ) 
       path = request.FILES['file'].temporary_file_path 
       utilities.docx_get_characters_number(path) # THIS NOT WORKS 

      return HttpResponseRedirect('/order-estimation') 
     else: 
      return render(request, 'auth/jobs/create-job.html', context=context) 

    return render(request, 'auth/jobs/create-job.html', context=context) 
+0

Haben Sie dieses https://docs.djangoproject.com/en/1.9/topics/http/file-uploads/ gelesen? Hier mehr Beispiele http://stackoverflow.com/questions/5871730/need-a-minimal-django-file-upload-beispiel – trinchet

Antwort

3

Die InMemoryUploadedFile nicht temporary_file_path bieten. Der Inhalt lebt "im Gedächtnis" - wie der Klassenname andeutet.

Standardmäßig verwendet Django InMemoryUploadedFile für Dateien mit einer Größe von bis zu 2,5 MB, größere Dateien verwenden TemporaryFileUploadHandler. wo das später die temporary_file_path Methode in Frage stellt. Django Documentation

So eine einfache Möglichkeit wäre, um Ihre Einstellungen zu ändern für FILE_UPLOAD_HANDLERS immer TemporaryFileUploadHandler zu verwenden:

FILE_UPLOAD_HANDLERS = [ 
    'django.core.files.uploadhandler.TemporaryFileUploadHandler', 
] 

Denken Sie auch daran, dass dies nicht der effizienteste Weg, wenn Sie eine Website mit viel haben von gleichzeitigen kleinen Upload-Anfragen.

+1

Was ist der effizienteste Weg, wenn es viele gleichzeitige Anfragen gibt? –