单文件和多文件html的区别就是multiple
toml
[dependencies]
rocket = "0.5.1"
[package.metadata.rocket]
config = "Rocket.toml"
Rocket.toml 配置文件上传的大小限制
[default.limits]
form = "160MB"
data-form = "160MB"
file = "160MB"
[development.limits]
form = "160MB"
data-form = "160MB"
file = "160MB"
[production.limits]
form = "160MB"
data-form = "160MB"
file = "160MB"
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>File Upload</title>
</head>
<body>
<h1>Upload a File</h1>
<form action="http://127.0.0.1:8000/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" id="file" multiple><br><br>
<input type="submit" value="Upload File">
</form>
</body>
</html>
单文件rs
use rocket::{routes,
post,
fs::TempFile,
form::FromForm,
form::Form,
http::Status,
};
use std::path::{Path};
#[derive(FromForm)]
struct Upload<'f> {
file: TempFile<'f>,
}
#[post("/", format = "multipart/form-data", data = "<form>")]
async fn upload_file(mut form: Form<Upload<'_>>) -> Result<String, Status> {
let file_name = form.file.raw_name().map(|name| name.dangerous_unsafe_unsanitized_raw().as_str())
.unwrap_or_else(|| "default_filename.pdf");
println!("{}", file_name);
let tmp_path = Path::to_str(form.file.path().unwrap()).map(|s| s.to_string()).unwrap();
println!("{}", tmp_path);
let upload_dir = "uploads";
std::fs::create_dir_all(upload_dir).map_err(|_| Status::InternalServerError)?;
let upload_path = std::path::Path::new(upload_dir).join(file_name);
if form.file.copy_to(upload_path.clone()).await.is_ok() {
std::fs::remove_file(tmp_path).map_err(|_| Status::InternalServerError)?;
Ok(format!("上传成功 {}", upload_path.display()))
} else {
Err(Status::InternalServerError)
}
}
#[rocket::main]
async fn main() -> Result<(), rocket::Error> {
rocket::build()
.mount("/upload", routes![upload_file])
.launch()
.await?;
Ok(())
}
多文件
use rocket::{routes,
post,
fs::TempFile,
form::FromForm,
form::Form,
http::Status,
};
use std::path::{Path};
#[derive(FromForm)]
struct Upload<'f> {
file: Vec<TempFile<'f>>,
}
#[post("/", format = "multipart/form-data", data = "<form>")]
async fn upload_file(mut form: Form<Upload<'_>>) -> Result<String, Status> {
let upload_dir = "uploads";
std::fs::create_dir_all(upload_dir).map_err(|_| Status::InternalServerError)?;
for temp_file in form.file.iter_mut() {
let file_name = temp_file.raw_name()
.map(|name| name.dangerous_unsafe_unsanitized_raw().as_str())
.unwrap_or_else(|| "default_filename.pdf");
println!("{}", file_name);
let upload_path = Path::new(upload_dir).join(file_name.to_string());
let tmp_path = Path::to_str(temp_file.path().unwrap()).map(|s| s.to_string()).unwrap();
println!("{}", tmp_path);
if !temp_file.copy_to(upload_path.clone()).await.is_ok() {
std::fs::remove_file(tmp_path).map_err(|_| Status::InternalServerError)?;
return Err(Status::InternalServerError);
}
}
Ok(format!("上传成功"))
}
#[rocket::main]
async fn main() -> Result<(), rocket::Error> {
rocket::build()
.mount("/upload", routes![upload_file])
.launch()
.await?;
Ok(())
}
纯文本上传
#[post("/upload2", format = "text/plain", data = "<file>")]
async fn upload(mut file: TempFile<'_>) -> std::io::Result<()> {
let permanent_location = PathBuf::from("F:\\code\\rocket-upload\\uploads\\11.txt");
file.copy_to(permanent_location).await
}
postman模拟纯文本上传,写入文件
在Body部分,选择raw选项,然后在右侧的下拉菜单中选择plain类型或者text类型。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了