12 Stimmen

Wie man eine Datei mit django (Python) und s3 hochladen?

Ich suche nach einer Möglichkeit, eine Datei auf s3 hochzuladen. Ich benutze django. Ich bin derzeit mit Amazons Python-Bibliothek für das Hochladen zusammen mit dem folgenden Code:

Ansicht:

def submitpicture(request):
    fuser = request.session["login"]

    copied_data = request.POST.copy()
    copied_data.update(request.FILES)
    content_type = copied_data['file'].get('content-type')
    ffile = copied_data['file']['content']
    key = '%s-%s' % (fuser, ''.join(copied_data['file']['filename'].split(' ')))
    site_s3.save_s3_data(key, ffile, content_type)

Vorlage:

<form action="/submitpicture/" method="POST">
    <input type="file" id="file" name="file" />
    <input type="submit" value="submit" />
</form>

Wenn ich jedoch versuche, es auszuführen, erhalte ich folgende Fehlermeldung:

"Key 'file' not found in <QueryDict: {}>"
#MultiValueDictKeyError

Ich wüsste wirklich nicht, was ich falsch machen sollte. Kann mir jemand die richtige Richtung weisen?

Edit: Nur für den Fall, dass sich jemand wundert, ich habe vor, eine Validierung hinzuzufügen, nachdem ich den eigentlichen Upload zum Laufen gebracht habe.

19voto

ayaz Punkte 10168

Sie müssen dem FORM-Element das enctype-Attribut zuweisen (das ist mir auch schon passiert). Zum Beispiel sollte Ihr FORM-Tag wie folgt aussehen:

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

Ohne den enctype werden Sie eine leere request.FILES vorfinden.

5voto

Alex Gaynor Punkte 13458

Anstatt dies manuell zu tun, würde ich einen Blick auf das Speicher-Backend werfen, das David Larlet für Django geschrieben hat, django-storages

2voto

Das Hinzufügen von enctype="multipart/form-data" scheint etwas zu sein, das es wert ist, im Abschnitt "File Uploads" der django-Dokumente erwähnt zu werden ( http://docs.djangoproject.com/en/dev/topics/http/file-uploads/ ). Was denken Sie?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X