首页 > 其他分享 >rocket实现文件单/多文件上传

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

时间:2024-10-30 11:08:59浏览次数:4  
标签:文件 rocket form upload let file path 上传 name

单文件和多文件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 方法将目录和文件名组合成 Path
    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)?;
    // 遍历 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(())
}

标签:文件,rocket,form,upload,let,file,path,上传,name
From: https://www.cnblogs.com/qcy-blog/p/18515489

相关文章

  • Jupyter Notebook的所有文件ipynb保存下来
    前言如果你想要保存整个JupyterNotebook工作目录,包括所有笔记本和其他相关文件,最直接的方法是将整个文件夹压缩为一个ZIP或TAR文件。下载单个文件压缩文件夹下载在JupyterLab的左侧文件浏览器中,点击“+”号,然后选择“终端”(Terminal)#创建一个ZIP压缩文件zip-......
  • APUE03 - 系统数据文件与时间
    /etc/passwd在Linux和Unix系统中,/etc/passwd 是一个重要的系统文件,用于存储用户账户的信息。尽管文件名是 passwd,但它并不保存用户密码(密码通常存储在 /etc/shadow 文件中),而是包含用户的基本信息。/etc/passwd 文件结构每行代表一个用户账户,字段由冒号 : 分隔。......
  • C10-09-XSS之获取键盘记录、盲打获取cookie及克隆网站和文件上传绕过练习
    免责声明本文仅是个人对XSS和文件上传绕过及相关工具的学习测试过程记录,不具有恶意引导意向。一使用pikachu平台练习XSS键盘记录以dvwa-Low靶场为目标网站,通过dvwa的存储型XSS上传JS,验证pikachu工具对dvwa靶场页面键盘操作的记录1.1调试pikachu环境①调整Pikac......
  • 【Canvas与图标】牛皮纸文件袋图标
    【成图】120*120的png图标:以下是大小图:【代码】<!DOCTYPEhtml><htmllang="utf-8"><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/><head><title>文件袋图标</title><styletype=&q......
  • 如何使用MD5校验系统文件完整性?
    1、首先,我们先了解一下什么是MD5?很多朋友并不是很了解MD5是什么,针对这个问题,我们来做一下简单的介绍。MD5为计算机安全领域广泛使用的一种散列函数,用以提供文件的完整性保护。简单来说就是用来校验文件在下载过程中是否损坏。2、为什么要对系统文件进行MD5校验呢?经常碰到......
  • 微软开放 Android in File Explorer:Win10 / Win11 文件管理器可无线管控安卓手机存储
    万象系统之家 10月29日消息,微软公司已逐步面向所有Windows10、Windows11用户,开放“AndroidinFileExplorer”,让用户不需要借助USB数据线,就能在文件管理器中操作安卓手机存储。微软的Android文件资源管理器集成功能为用户提供了更便捷的跨设备文件管理体验。随着......
  • 【SpringMVC】传递json,获取url参数,上传文件
    【传递json数据】【json概念】一种轻量级数据交互格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,其本质上是字符串,负责在不同的语言中数据传递与交换json数据以字符串的形式体现【json字符串与Java对象互转】我们需要在pom.xml中增加对json的依赖【对象转jso......
  • 教培行业的文件安全管理方案
    在教培行业快速发展的今天,教学资料、课程内容、学员信息等文件资产的安全管理已成为机构运营中不可忽视的重要环节。优质的教学内容和教学资料是教培机构的核心竞争力,如何确保这些宝贵资产的安全性和可控性,需要建立系统化的管理方案。首先,教培机构面临的文件安全风险主要来......
  • 文件中台与安全:集成方案的探索与实践
    在企业数字化转型加速的今天,文件中台已成为支撑数据共享与高效协作的关键基础设施。然而,随着企业文件需求的增多和内容复杂性的提升,文件的安全问题也日益突显。如何在构建强大文件中台的同时,保障文件数据的安全性,已成为企业亟需解决的课题。文件中台的核心功能文件中台是企......
  • 文件查找与打包
    文件查找findfind是实时查找工具,通过遍历指定路径完成文件查找工作特点:查找速度略慢精确查找实时查找查找条件丰富可能只搜索用户具备读取和执行权限的目录格式:find[OPTION]...[查找路径][查找条件][处理动作]查找路径:指定具体目标路径;默认为当前目录查找条件:指......