2017-07-25 3 views
3

Ich möchte einen HTTP-POST in Rocket mit einer Struktur analysieren. Nach dem Absenden des Formulars schlägt es fehl.Parsen von HTTP-Multipart-POST mit einer Struktur in Rocket

Ich lese das body data Beispiel und habe diesen Code.

#[derive(FromForm)] 
struct ConvertFile { 
    name: String, 
    filename: String 
} 

#[post("/submit", format = "multipart/form-data", data = "<form>")] 
fn submit(form: Form<ConvertFile>) { 
    println!("form field: {}", form.get().name); 
} 

Ich lege mit curl:

curl -H "Content-Type: multipart/form-data" -F "name=Claus" -F "filename=claus.jpg" http://localhost:8000/submit 

und die Rocket-Konsole reagiert mit

multipart/form-data; boundary=------------------------8495649d6ed34d20: 
    => Matched: POST /submit multipart/form-data 
    => Warning: Form data does not have form content type. 
    => Outcome: Forward 
    => Error: No matching routes for POST /submit multipart/form-data; boundary=------------------------8495649d6ed34d2. 
    => Warning: Responding with 404 Not Found catcher. 
    => Response succeeded. 

ich eine Datei daher der multipart/form-data einreichen möchten. Beim Versuch, den Grund zu finden, habe ich einen String in der Struktur verwendet, um es einfacher zu machen. Also zuerst antwortet es mit einer Matched: und dann keine passenden Routen.

Diese einfachere POST funktioniert:

#[post("/convert", format = "text/plain", data = "<file>")] 
fn convert_file(file: String) { 
    println!("file: {}", file); 
} 

Ich bin die letzte nächtliche Rust mit rustup verwenden.

Was mache ich falsch?

+0

Ich bin nicht sicher, aber haben Sie mit passenden Formularfelder in Ihrem 'curl' Befehl versucht ? Sie haben 'file' und' filename' in diesem 'ConvertFile', nicht' name' und 'filename'. –

+0

Die Felder in der Struktur stammen aus einem früheren Entwurf, der in SO automatisch gespeichert wurde. Also habe ich vergessen, es mit dem aktuellen curl-Befehl zu ändern, als ich die Frage einreichte. Danke, dass Sie das bemerkt haben, ich habe es so modifiziert, dass es korrekt ist. – kometen

Antwort

3

Rocket unterstützt noch keine multipart Formulare.

können Sie die Tracking-Ausgabe sehen hier: https://github.com/SergioBenitez/Rocket/issues/106

Eine mögliche Abhilfe in dieser Antwort gegeben: How to parse multipart forms using abonander/multipart with Rocket?

+0

Danke. Aber dann muss das Beispiel unter https://rocket.rs/guide/requests/#forms falsch sein? – kometen

+0

Nein, Formulare funktionieren, nur nicht der Multipart Content-Typ. – belst

+0

Hmm, http Form Post mit Curl ist, was ich habe Probleme beim Senden. 'curl -X POST -f Name = claus Dateiname = claus.jpg'. – kometen