2014-08-31 16 views
5

Próbuję podążać za this simple tutorial w celu przesyłania plików w kolbie. Aby przesłać pliki używam poniższego formularza HTML:Dlaczego `request.files` jest pusty?

<form action="" method="post" "enctype=multipart/form-data"> 
<table border="0" summary=""><tbody> 
    <tr> 
     <th> 
      <label for="image_file">Your image:</label> 
     </th> 
     <td> 
      <input type="file" id="image_file" name="image_file"></input> 
     </td> 
    </tr> 
    <tr> 
     <td> 
     </td> 
     <td> 
      <input type="submit" value="Submit" /> 
      <a href="/test_func">Cancel</a> 
     </td> 
    </tr> 
</tbody></table> 
</form> 

Po złożeniu formularza sprawdzić zawartość zmiennej request w następujący sposób:

print 'request.method', request.method 
print 'request.args', request.args 
print 'request.form', request.form 
print 'request.files', request.files 

W rezultacie pojawia się następujący:

request.method POST 
request.args ImmutableMultiDict([]) 
request.form ImmutableMultiDict([('image_file', u'badge.gif')]) 
request.files ImmutableMultiDict([]) 

Czego nie rozumiem, to, co request.files jest puste. Zgodnie z powyższym przytoczonym samouczkiem muszę użyć file = request.files['file'], aby pobrać obiekt pliku (aby go zapisać).

Co robię źle?

+2

Jeśli to naprawdę HTML, którego używasz, podwójny cudzysłów powinien pojawić się po 'enctype ='. W tej chwili cała sprawa jest ciągiem, więc prawdopodobnie nie wysyła pliku, tylko nazwa z pola. – davidism

Odpowiedz

8

Masz niepoprawny cytat z formularza. Tutorial mówi ci używać:

<form action="" method=post enctype=multipart/form-data> 

(bez cudzysłowów), ale lepiej ukształtowany HTML byłoby użyć:

<form action="" method="post" enctype="multipart/form-data"> 

Zauważ, że cytaty są wokół tylko wartości atrybutów .

Bez prawidłowego ustawienia enctype, formularz używa innego kodowania, a przeglądarka nie będzie poprawnie ładować danych pliku, ani też nie będzie analizować danych w plikach.

Powiązane problemy