1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
/* * This file is part of Actix Form Data. * * Copyright © 2018 Riley Trautman * * Actix Form Data is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Actix Form Data is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Actix Form Data. If not, see <http://www.gnu.org/licenses/>. */ //! # Actix Form Data //! A library for retrieving form data from Actix Web's multipart streams. It can stream //! uploaded files onto the filesystem (its main purpose), but it can also parse associated //! form data. //! //! # Example //! //!```rust //! extern crate actix_web; //! extern crate form_data; //! extern crate futures; //! extern crate mime; //! //! use std::path::PathBuf; //! //! use actix_web::{http, server, App, AsyncResponder, HttpMessage, HttpRequest, HttpResponse, State}; //! use form_data::{handle_multipart, Error, Field, FilenameGenerator, Form}; //! use futures::Future; //! //! struct Gen; //! //! impl FilenameGenerator for Gen { //! fn next_filename(&self, _: &mime::Mime) -> Option<PathBuf> { //! let mut p = PathBuf::new(); //! p.push("examples/filename.png"); //! Some(p) //! } //! } //! //! fn upload( //! req: HttpRequest<Form>, //! state: State<Form>, //! ) -> Box<Future<Item = HttpResponse, Error = Error>> { //! handle_multipart(req.multipart(), state.clone()) //! .map(|uploaded_content| { //! println!("Uploaded Content: {:?}", uploaded_content); //! HttpResponse::Created().finish() //! }) //! .responder() //! } //! //! fn main() { //! let form = Form::new() //! .field("Hey", Field::text()) //! .field( //! "Hi", //! Field::map() //! .field("One", Field::int()) //! .field("Two", Field::float()) //! .finalize(), //! ) //! .field("files", Field::array(Field::file(Gen))); //! //! println!("{:?}", form); //! //! server::new(move || { //! App::with_state(form.clone()) //! .resource("/upload", |r| r.method(http::Method::POST).with2(upload)) //! }).bind("127.0.0.1:8080") //! .unwrap(); //! // .run() //! } //!``` extern crate actix_web; extern crate bytes; #[macro_use] extern crate failure; extern crate futures; extern crate futures_cpupool; extern crate futures_fs; extern crate http; #[macro_use] extern crate log; extern crate mime; #[cfg(feature = "with-serde")] extern crate serde; #[cfg(feature = "with-serde")] #[macro_use] extern crate serde_derive; use std::path::PathBuf; mod error; mod types; mod upload; pub use self::error::Error; pub use self::types::*; pub use self::upload::handle_multipart; /// A trait for types that produce filenames for uploade files /// /// Currently, the mime type provided to the `next_filename` method is guessed from the uploaded /// file's original filename, so relying on this to be 100% accurate is probably a bad idea. pub trait FilenameGenerator: Send + Sync { fn next_filename(&self, &mime::Mime) -> Option<PathBuf>; }