multer_derive/
form_file.rs

1use crate::{
2    error::Error, from_multipart_field::FromMultipartField, multipart_form::MultipartField,
3};
4use http::HeaderMap;
5use mime::Mime;
6use multer::bytes::Bytes;
7
8/// Represents a file sent in a form.
9#[derive(Debug, Clone)]
10pub struct FormFile {
11    bytes: Bytes,
12    headers: HeaderMap,
13    content_type: Mime,
14    name: String,
15    file_name: String,
16}
17
18impl FormFile {
19    /// Returns the bytes of this file.
20    pub fn bytes(&self) -> &Bytes {
21        &self.bytes
22    }
23
24    /// Return the name of the form field
25    pub fn name(&self) -> &str {
26        &self.name
27    }
28
29    /// Returns the file name.
30    pub fn file_name(&self) -> &str {
31        &self.file_name
32    }
33
34    /// Returns the headers of the file.
35    pub fn headers(&self) -> &HeaderMap {
36        &self.headers
37    }
38
39    /// Returns the content type of this file.
40    pub fn content_type(&self) -> &Mime {
41        &self.content_type
42    }
43}
44
45impl FromMultipartField for FormFile {
46    fn from_field(field: &MultipartField) -> Result<Self, Error> {
47        let name = field
48            .name()
49            .ok_or_else(|| Error::new("field does not have a name"))?
50            .to_owned();
51
52        let file_name = field
53            .file_name()
54            .ok_or_else(|| Error::new("file does not have a name"))?
55            .to_owned();
56
57        let headers = field.headers().clone();
58        let bytes = field.bytes().clone();
59        let content_type = field
60            .content_type()
61            .cloned()
62            .unwrap_or(mime::APPLICATION_OCTET_STREAM);
63
64        Ok(FormFile {
65            bytes,
66            headers,
67            name,
68            file_name,
69            content_type,
70        })
71    }
72}