rocket实现文件单/多文件上传

news/2024/10/30 11:18:32/文章来源:https://www.cnblogs.com/qcy-blog/p/18515489

单文件和多文件html的区别就是multiple

toml

[dependencies]
rocket = "0.5.1"
[package.metadata.rocket]
config = "Rocket.toml" 

Rocket.toml 配置文件上传的大小限制

# Rocket.toml[default.limits]
form = "160MB"  # 设置文件上传的最大大小为16MB
data-form = "160MB"
file = "160MB"
[development.limits]
form = "160MB"  # 设置文件上传的最大大小为16MB
data-form = "160MB"
file = "160MB"[production.limits]
form = "160MB"  # 设置文件上传的最大大小为16MB
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>
<!-- 表单的 action 指向你的 Rocket 应用的 '/upload' 路由 -->
<!-- 表单的 enctype 设置为 "multipart/form-data" 以支持文件上传 -->
<form action="http://127.0.0.1:8000/upload" method="post" enctype="multipart/form-data"><!-- 文件输入字段 --><!-- 单文件不需要multiple --><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> {// 直接从 Option<FileName> 中提取文件名并转换为 String,但是这种是没有后缀的,被优化过的// let file_name =  match  form.file.name() {//     Some(s) => s,//     None => "None-0"  //可以用uuid// };// // 从 Path 中提取文件名,包括后缀名//  let file_path = form.file.path().ok_or(Status::InternalServerError)?;//  let path = Path::new(file_path); // 将路径转换为 Path 类型//  let file_name1 = path.file_name().ok_or(Status::InternalServerError)?.to_str().ok_or(Status::InternalServerError)?.to_string();//  println!("File name with extension: {}", file_name1); // 打印完整的临时文件名//取出上传的时候的老的文件名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);//获取是json jpg png zip 。。。。。//let extension =  form.file.content_type().map(|s| s.media_type().sub().to_string());//println!("{:?}", extension);//打印tmp_path目录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); // 使用 join 方法将目录和文件名组合成 Pathif 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)?;// 遍历 form.files 并使用 iter_mut 获取每个文件的可变引用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(())
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/824061.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《vue3第四章》Composition API 的优势,包含Options API 存在的问题、Composition API 的优势

《vue3第四章》Composition API 的优势,包含Options API 存在的问题、Composition API 的优势@目录四、Composition API 的优势1.Options API 存在的问题2.Composition API 的优势 四、Composition API 的优势 1.Options API 存在的问题 使用传统OptionsAPI中,新增或者修改一…

USB协议详解第27讲(USB包-中断传输包详解)

1.中断传输包结构 中断传输和批量传输类似,中断传输只由一个中断事务组成,中断事务包含令牌包、数据包、握手包,如图下所示。中断事务类型的特点是能够通过错误检测和重试来保证主机和设备之间数据的无错误传递。 需要理解和注意以下点。(1)当主机准备接收数据时,它发出I…

.NET 实现的零部件离散型 MES+WMS 系统

前言 随着制造业的不断发展,企业对于生产效率和管理水平的要求越来越高。 EasyMES 是一款基于 .NET 6 开发的零部件离散型 MES(Manufacturing Execution System)+ WMS(Warehouse Management System)系统,可以帮助企业提升生产效率和管理水平。 本文将详细介绍 EasyMES 的…

Hugging Face 与 TruffleHog 合作,实现风险预警

我们非常高兴地宣布与 Truffle Security 建立合作伙伴关系并在我们的平台集成 TruffleHog 强大的风险信息扫描功能。这些特性是 我们持续致力于提升安全性 的重要举措之一。TruffleHog 是一款开源工具,用于检测和验证代码中的机密信息泄露。它拥有广泛的检测器,覆盖多种流行 …

vue3知识点:Teleport组件

vue3知识点:Teleport组件@目录五、新的组件2.Teleport案例完整代码本人其他相关文章链接 五、新的组件 2.Teleport问题:什么是Teleport?答案:Teleport 是一种能够将我们的组件html结构移动到指定位置的技术。 <teleport to="移动位置"><div v-if="…

Jenkins使用maven打包项目

Jenkins使用maven打包项目 作为一名软件测试工程师,在日常工作中,我们经常需要使用Jenkins进行持续集成和持续部署(CI/CD)。而Maven作为Java项目的构建工具,更是不可或缺。今天,我将向大家介绍如何在Jenkins中使用Maven打包项目。 一、准备工作 登录Jenkins后,点击Manag…

3216. 交换后字典序最小的字符串

给你一个仅由数字组成的字符串 s,在最多交换一次 相邻 且具有相同 奇偶性 的数字后,返回可以得到的 字典序最小的字符串 。 如果两个数字都是奇数或都是偶数,则它们具有相同的奇偶性。例如,5 和 9、2 和 4 奇偶性相同,而 6 和 9 奇偶性不同。 示例 1: 输入: s = "4…

实现注解校验Dto字段是否为空

一、背景 我们用json对象作为接收参数的包装器,最后要转化为dto进行业务操作,操作之前要做非空校验,我们可以实现2个注解来实现这个通用的操作。@NotNullField @CheckNull 二、思路 1.实现@NotNullField注解,注解标记在dto字段名上面 @Target(ElementType.FIELD) // 目标为字…

学习高校课程-系统设计与分析-进入设计领域(lec6)

IndexFundamental Design Tasks and Activities 基本设计任务和活动 Understanding the challenges in Iteration 0 了解迭代 0 中的挑战 Structural Modeling and Behavior Modeling 结构建模和行为建模 More on Common Used DiagramsPackage Diagram 封装图 Interaction Diag…

乐维网管平台(三)如何高效管理无线网络

一、无线网络管理概述 1.什么是无线网络管理 无线网络管理是指利用专门的软件平台(如网管平台)对无线网络设备(如无线接入点、无线控制器等)及其相关资源进行集中监控、配置、优化和维护的一系列操作。其主要目的是确保无线网络的高效稳定运行,提升用户体验,保障网络安全…

销售的艺术:价值与策略

一、销售的核心在于展现价值 销售不仅仅是表面的推销技巧,如“多多关照,多多捧场”或“只有今天的500单有这个价格”。其核心在于“展现价值”,即将商品的功能、优点、魅力和价值传递给有需求的人,激发他们的购买欲望。一个简单的公式——价值>价格,是销售过程中的关键所…

Fastjson枚举序列化和反序列化的推荐实现

一、背景 项目中定义了很多dto,包含枚举类型,而且这些枚举全都自定义标志码。比如7001 对应 某种操作。返回前台时,需要转化为对应的7001,前台传入后台时也希望7001转化为枚举。 二、研究思路 一开始,研究了fastjson的默认实现。发现只有不自定义类似7001这种默认值的时候,…