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 解析实现
每月451次下载
在 13 个crate中使用 (12 个直接使用)
32KB
548 行
formdata
文档可在 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