31个版本

使用旧Rust 2015

0.13.0 2020年10月1日
0.12.3 2019年3月28日
0.12.2 2017年9月20日
0.12.1 2017年3月11日
0.5.0 2015年7月9日

#1445 in 解析实现

Download history 129/week @ 2024-03-11 129/week @ 2024-03-18 66/week @ 2024-03-25 313/week @ 2024-04-01 61/week @ 2024-04-08 71/week @ 2024-04-15 105/week @ 2024-04-22 104/week @ 2024-04-29 90/week @ 2024-05-06 142/week @ 2024-05-13 84/week @ 2024-05-20 105/week @ 2024-05-27 116/week @ 2024-06-03 126/week @ 2024-06-10 124/week @ 2024-06-17 79/week @ 2024-06-24

每月451次下载
13 个crate中使用 (12 个直接使用)

MIT 许可证

32KB
548

formdata

Build Status MIT licensed

文档可在 https://mikedilger.github.io/formdata 查找

此库提供了一种用于存储 multipart/form-data 数据的类型,以及用于通过HTTP流式传输(读取或写入)此类数据的函数。

multipart/form-data 格式,如RFC 7578所述。使用enctype=multipart/form-data 的HTML表单以该格式发送数据。此 enctype 通常在表单具有文件上传输入字段时使用,因为默认的 application/x-www-form-urlencoded 无法处理文件上传。

无论是从流中读取还是向流中写入,文件都不会完全存储在内存中,而是通过缓冲区流式传输。


lib.rs:

此库提供了一种用于存储 multipart/form-data 数据的类型,以及用于通过HTTP流式传输(读取或写入)此类数据的函数。

multipart/form-data 格式,如RFC 7578所述。使用enctype=multipart/form-data 的HTML表单以该格式发送数据。此 enctype 通常在表单具有文件上传输入字段时使用,因为默认的 application/x-www-form-urlencoded 无法处理文件上传。

无论是从流中读取还是向流中写入,文件都不会完全存储在内存中,而是通过缓冲区流式传输。

读取示例

extern crate mime;
extern crate hyper;
extern crate formdata;

use hyper::server::{Server, Request, Response};

fn main() {
  let server = Server::http("0.0.0.0:0").unwrap().handle(handler).unwrap();
}

fn handler(hyper_request: Request, res: Response) {
  let (_, _, headers, _, _, mut reader) = hyper_request.deconstruct();
  let form_data = formdata::read_formdata(&mut reader, &headers).unwrap();

  for (name, value) in form_data.fields {
    println!("Posted field name={} value={}", name, value);
  }

  for (name, file) in form_data.files {
    println!("Posted file name={} path={:?}", name, file.path);
  }
}

写入示例

extern crate mime;
extern crate hyper;
extern crate formdata;

use std::path::Path;
use hyper::header::{Headers, ContentType};
use mime::{Mime, TopLevel, SubLevel};
use formdata::{FormData, FilePart};

fn main() {
  let mut stream = ::std::io::stdout();
  let mut photo_headers = Headers::new();
  photo_headers.set(ContentType(Mime(TopLevel::Image, SubLevel::Gif, vec![])));
  // no need to set Content-Disposition (in fact it will be rewritten)

  let formdata = FormData {
    fields: vec![ ("name".to_owned(), "Baxter".to_owned()),
                  ("age".to_owned(), "1 month".to_owned()) ],
    files: vec![ ("photo".to_owned(), FilePart::new(
         photo_headers, Path::new("/tmp/puppy.gif"))) ],
  };

  let boundary = formdata::generate_boundary();
  let count = formdata::write_formdata(&mut stream, &boundary, &formdata).unwrap();
  println!("COUNT = {}", count);
}

依赖项

~8–17MB
~256K SLoC