【Tauri2】049——upload
前言
这篇就看看一个简单地插件——upload
Upload | Taurihttps://tauri.app/plugin/upload/upload的英文意思是“上传(程序或信息)”。
看来是用来上传文件的。
支持移动端
正文
安装
pnpm tauri add upload
在前后端都会安装,即
.plugin(tauri_plugin_upload::init())
"@tauri-apps/plugin-upload": "~2.2.1",
看看通信函数
.invoke_handler(tauri::generate_handler![download, upload])
一个是download,一个是upload。
看看其中的download的函数签名
#[command]
async fn download(url: &str,file_path: &str,headers: HashMap<String, String>,body: Option<String>,on_progress: Channel<ProgressPayload>,
) -> Result<()>
- url:需要下载的网址
- file_path:保存的路径
- headers:请求头
- body:请求体
- on_progress:是一个Channel,其中类型是ProgressPayload
其中这个ProgressPayload是什么东西?
#[derive(Clone, Serialize)]
#[serde(rename_all = "camelCase")]
struct ProgressPayload {progress: u64,progress_total: u64,total: u64,transfer_speed: u64,
}
实现了Clone、Serialize。
从其中的英文意思,可以简单地发现——用于封装下载进度信息(当前进度、总大小、传输速度等)。
总体看来,这个download函数意思就是下载文件的,封装了reqwest。
和http插件大同小异,只是更具体了。
看看upload函数
#[command]
async fn upload(url: &str,file_path: &str,headers: HashMap<String, String>,on_progress: Channel<ProgressPayload>,
) -> Result<String>
和download差不多。
这两个函数,一个下载,一个上传。
本质就是发送一个请求。
笔者发现好像不能在Rust中使用。就在前端使用
download
下载,可以下载图片,也可以下载文件。笔者找了一个文件
笔者先下个图片试试,图片的地址如下
OIP.cIGsR32hEtqHtejFiRP2jAHaHa (474×474)https://th.bing.com/th/id/OIP.cIGsR32hEtqHtejFiRP2jAHaHa?rs=1&pid=ImgDetMain前端代码如下
async function clicked() {let imageUrl="https://th.bing.com/th/id/OIP.cIGsR32hEtqHtejFiRP2jAHaHa?rs=1&pid=ImgDetMain"let filepath="C:\\Users\\26644\\Downloads\\tt.jpg"let headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"}await download(imageUrl,filepath,({progress, total}) =>console.log(`Downloaded ${progress} of ${total} bytes`),headers)}
然而,笔者运行的时候报错了
"error sending request for url (https://th.bing.com/th/id/OIP.cIGsR32hEtqHtejFiRP2jAHaHa?rs=1&pid=ImgDetMain)"
说实话,笔者不是很理解,这都能报错,就是发送一个请求。
然后,笔者打断点,发现在download这个通信函数中
下面代码
let response = request.send().await?;
每次运行到这一步就会直接打包。
笔者也没找到解决办法。笔者搜了搜。
还是不行。
笔者发现这个插件的features有三个选项
都是tls
TLS 是用于网络通信加密的协议,确保数据安全、完整和身份验证,广泛用于 HTTPS 请求。
因此,看来问题就在这里。
- native-tls 使用系统 TLS 库,依赖环境。
- native-tls-vendored 使用内置 OpenSSL,跨平台一致。
- rustls-tls 使用纯 Rust 的 rustls,内存安全但兼容性可能稍差。
因此,笔者使用native-tls-vendored,即
tauri-plugin-upload = { version = "2.2.1", features = ["native-tls-vendored"] }
结果如下
笔者使用其他也可以的。
再比如,下载yakit。
yaklang/yakit: Cyber Security ALL-IN-ONE Platformhttps://github.com/yaklang/yakit其下载的地址
https://github.com/yaklang/yakit/releases/download/v1.4.1-0530/Yakit-1.4.1-0530-windows-amd64.exehttps://github.com/yaklang/yakit/releases/download/v1.4.1-0530/Yakit-1.4.1-0530-windows-amd64.exe结果如下
有点慢,没问题
这里感觉可以可视化。添加进度条。
搞个进度条,结果如下
import {useState} from 'react';
import {download} from '@tauri-apps/plugin-upload';
import './Home.css';export default function Home() {const [progress, setProgress] = useState(0);const [progressText, setProgressText] = useState('0 / 0 bytes');const [isDownloading, setIsDownloading] = useState(false);const clicked = async () => {setIsDownloading(true);setProgress(0);setProgressText('0 / 0 bytes');const url = 'https://github.com/yaklang/yakit/releases/download/v1.4.1-0530/Yakit-1.4.1-0530-windows-amd64.exe';const filePath = 'C:\\Users\\26644\\Downloads\\yakit.exe';const headers = new Map<string, string>([['User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'],]);try {await download(url,filePath,({progressTotal, total}) => {let percentage = (progressTotal / total) * 100setProgress(percentage);setProgressText(`${progressTotal} / ${total} bytes`);},headers);setProgress(100);setProgressText('下载完成!');} catch (error:{ message?: string } | any) {console.error('下载失败:', JSON.stringify(error, null, 2));setProgressText(`下载失败: ${error.message || error}`);} finally {setIsDownloading(false);}};return (<div className="container"><h2>文件下载</h2><button onClick={clicked} disabled={isDownloading}>{isDownloading ? '下载中...' : '开始下载'}</button><div className="progress-container"><progress value={progress} max="100"/><div className="progress-text">{progressText}</div></div></div>);
}
.container {max-width: 600px;margin: 50px auto;text-align: center;font-family: Arial, sans-serif;
}.progress-container {margin-top: 20px;
}progress {width: 100%;height: 30px;border-radius: 5px;/* 自定义进度条样式(可选) */-webkit-appearance: none;appearance: none;
}progress::-webkit-progress-bar {background-color: #f0f0f0;border-radius: 5px;
}progress::-webkit-progress-value {background-color: #007bff;border-radius: 5px;
}.progress-text {margin-top: 10px;font-size: 16px;
}button {padding: 10px 20px;font-size: 16px;cursor: pointer;background-color: #007bff;color: white;border: none;border-radius: 5px;
}button:disabled {background-color: #6c757d;cursor: not-allowed;
}button:hover:not(:disabled) {background-color: #0056b3;
}
结果如下
没问题。
还有一个upload这个函数,笔者就不演示了,主要是不知道上传什么。
就这样。
相关文章:

【Tauri2】049——upload
前言 这篇就看看一个简单地插件——upload Upload | Taurihttps://tauri.app/plugin/upload/upload的英文意思是“上传(程序或信息)”。 看来是用来上传文件的。 支持移动端 正文 安装 pnpm tauri add upload 在前后端都会安装,即 .plug…...

4、数据标注的武林秘籍:Label-Studio vs CVAT vs Roboflow
开篇痛点:90%的模型效果取决于数据质量 "标注3小时,训练5分钟"——这是很多AI工程师的真实写照。上周有位读者训练YOLOv12时发现,同样的代码,换批数据mAP直接跌了15%,根本原因是标注不规范!本文…...
MATLAB项目实战:阻尼振动与数据拟合项目
关键技能点说明: 函数定义与匿名函数 使用匿名函数定义微分方程:damped_osc = @(t, Y) [...] 自定义拟合模型函数:model = @(b, t) b(1).*exp(...) 符号计算(可选) 使用符号数学工具箱求解析解:dsolve、diff、simplify 符号表达式数值化:subs + double 数值算法实现 ODE…...
74道Node.js高频题整理(附答案背诵版)
简述 Node. js 基础概念 ? Node.js是一个基于Chrome V8引擎的JavaScript运行环境。它使得JavaScript可以在服务器端运行,从而进行网络编程,如构建Web服务器、处理网络请求等。Node.js采用事件驱动、非阻塞I/O模型,使其轻量且高效…...

Linux 基础IO(上)
目录 前言 重谈文件 文件操作 1.打开和关闭 2.对文件打开之后操作 理解文件fd 1.文件fd的分配规则与重定向 2.理解shell中的重定向 3.关于Linux下一切皆文件 关于缓冲区 1.为什么要有缓冲区 2.缓冲区刷新策略的问题 3.缓冲区的位置 前言 本篇到了我们linux中的文件…...
如何加载私钥为 SecKeyRef
本文介绍如何在 iOS/macOS 下将私钥加载为 SecKeyRef,涵盖 PEM 格式的 ECC 密钥读取、X9.63 数据构建、以及与 Keychain 的集成。 1. 使用 SecKeyCreateWithData 加载私钥 Apple 提供的 SecKeyCreateWithData 方法可以直接将密钥数据加载为 SecKeyRef 对象。 SecK…...
@Pushgateway自定义脚本推送数据
文章目录 Pushgateway 自定义脚本推送数据1. 目的2. 适用范围3. 前提条件4. 操作流程4.1 确定指标类型和格式4.2 编写推送脚本方法一:使用 curl 命令行推送方法二:使用 Python 脚本推送方法三:使用 Python 客户端库推送4.3 设置定时任务4.4 验证数据5. 高级配置5.1 使用基本…...
kubernate解决 “cni0“ already has an IP address different from 10.244.0.1/24问题
问题 NetworkPlugin cni failed to set up pod “coredns-5d4b4db-jkmnl_kube-system” network: failed to set bridge addr: “cni0” already has an IP address different from 10.244.0.1/24 解决方案 这个问题通常是由于Flannel网络插件残留配置导致的IP地址冲突。以下…...

el-tree拖拽事件,限制同级拖拽,获取拖拽后节点的前后节点,同级拖拽合并父节点name且子节点加入目标节点里
node-drag-start:开始拖拽节点时触发(按下鼠标按钮),无论是否允许放置,此事件都会触发。 allow-drop 返回 true 才能触发@node-drag-end="handleDragend"、@node-drop="handleDrop"; (1)allow-drop:动态控制是否允许放置; (2)node-dr…...

day62—DFS—太平洋大西洋水流问题(LeetCode-417)
题目描述 有一个 m n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights , hei…...

《Python基础》第2期:环境搭建
在开始编写 Python 代码前,还需要搭建 Python 的开发环境。 电脑是没办法直接读懂 Python 代码的,而是需要一个解释器,实时把代码翻译成字节码,字节码再转换成 0 和 1,电脑就能读懂了。 Python 的运行过程就是翻译一行…...

WSL 安装 Debian 12 后,Linux 如何安装 curl , quickjs ?
在 WSL 的 Debian 12 系统中安装 curl 非常简单,你可以直接使用 APT 包管理器从官方仓库安装。以下是详细步骤: 1. 更新软件包索引 首先确保系统的包索引是最新的: sudo apt update2. 安装 curl 执行以下命令安装 curl: sudo…...

[CSS3]vw/vh移动适配
vw/vh 目标: 能够使用vw单位设置网页元素的尺寸 相对单位相对视口的尺寸计算结果.vw全称viewport width; 1vw1/100视口宽度 vh全称viewport height; 1vh1/100视口高度 体验vw和vh单位 <!DOCTYPE html> <html lang"en"> <head><meta charset…...
Python进阶与常用库:探索高效编程的奥秘
一、文件与目录操作:os模块 os模块是Python标准库中用于与操作系统交互的核心工具,提供了丰富的文件和目录操作方法。通过os,开发者可以轻松实现文件路径处理、环境变量获取、目录管理等功能。 1.1 核心功能与方法 以下是os模块中常用的方…...
nt!MiDispatchFault函数分析之nt!MiCompleteProtoPteFault函数的作用
nt!MiDispatchFault函数分析之nt!MiCompleteProtoPteFault函数的作用 第一部分: // // PTE is still in transition state, same protection, etc. // ASSERT (Pfn1->u4.InPageError 0); if (Pfn1->u2.ShareCount 0) { MI_REMO…...

YOLOX 的动态标签分类(如 SimOTA)与 Anchor-free 机制解析2025.5.29
YOLOX 的动态标签分类(如 SimOTA)与 Anchor-free 机制是其核心改进中的两个关键部分,它们在目标检测中的作用和实现方式存在显著差异。以下从原理、实现细节及效果三个方面进行详细对比: 一、核心原理与目标 1. Anchor-free 机制…...
打卡day42
DAY 42 Grad-CAM与Hook函数 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 作业:理解下今天的代码即可 1、回调函数 回调函数(Callback Function)是一种特殊的函数,它作为参数传递给另一个函数&am…...
小白的进阶之路系列之八----人工智能从初步到精通pytorch综合运用的讲解第一部分
PyTorch Tensors 通过大量实例学习编程应用是最有效的方法。 本篇是PyTorch综合运用,旨在让读者通过一行行代码亲自掌握Pytorch工具包的各种功能,有利于大家部署自己的神经网络人工智能计算工程。 首先,载入torch库。 import torch我们来看看一些基本的张量操作。首先,…...

724.寻找数组的中心下标前缀和
题目链接: https://leetcode.cn/problems/find-pivot-index/ 这道题目我们可以使用暴力解法,就一个下标前数组之和,再求一个下标后数组之和,时间复杂度达到n方,我们来写一下: int pivotIndex(vector<in…...

软考-系统架构设计师-第十六章 层次式架构设计理论与实践
层次式架构设计理论与实践 16.2 表现层框架设计16.3 中间层框架设计16.4 数据访问层设计16.5 数据架构规划与设计16.6 物联网层次架构设计 软件体系结构为软件系统提供了结构、行为和属性的高级抽象,由构成系统的元素描述这些元素的相互作用、指导元素集成的模式以及…...
甘特图 dhtmlxGantt.js UA实例
摘要:本文介绍了一个基于AngularJS的排产资源占用甘特图系统,包含前端界面展示和后端控制逻辑。系统通过HTML模板实现甘特图展示区域、查询条件表单和数据绑定,使用JavaScript控制器处理数据查询、甘特图初始化和交互逻辑。主要功能包括&…...

Docker学习笔记:基础知识
本文是自己的学习笔记 1、什么是Docker2、Docker的架构设计2.1、镜像(Image)2.2、容器(Container)2.3、仓库(Repository)2.4、Docker使用场景案例 1、什么是Docker Docker是基于Go语言实现的云开源项目。它的角色是作…...

5.2 初识Spark Streaming
在本节实战中,我们初步探索了Spark Streaming,它是Spark的流式数据处理子框架,具备高吞吐量、可伸缩性和强容错能力。我们了解了Spark Streaming的基本概念和运行原理,并通过两个案例演示了如何利用Spark Streaming实现词频统计。…...
uv:一个现代化的 Python 依赖管理工具
在 Python 的生态系统中,依赖管理和 Python 版本管理一直是开发者关注的核心问题。传统的工具如 pip、poetry 和 pyenv 虽然功能强大,但在性能和使用体验上仍有改进空间。uv 是由 Python 核心开发者开发的 现代化依赖管理工具,旨在提供更快、…...

Python趣学篇:交互式词云生成器(jieba + Tkinter + WordCloud等)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、为什么要做词云?让文字"活"起来!二、核心…...

理解解释器架构:原理、组成与运行机制全解析
目录 前言1. 什么是解释器架构2. 解释器的基本组成2.1 被解释执行的程序2.2 解释器引擎2.3 解释器内部状态2.4 程序执行的当前状态2.5 存储器模型 3. 解释器的工作原理3.1 解析源代码3.2 初始化运行环境3.3 逐条执行语法结构3.4 维护程序状态3.5 内存管理与变量作用域 4. 举例&…...

2025华为OD机试真题+全流程解析+备考攻略+经验分享+Java/python/JavaScript/C++/C/GO六种语言最佳实现
华为OD全流程解析,备考攻略 快捷目录 华为OD全流程解析,备考攻略一、什么是华为OD?二、什么是华为OD机试?三、华为OD面试流程四、华为OD薪资待遇及职级体系五、ABCDE卷类型及特点六、题型与考点七、机试备考策略八、薪资与转正九、…...
Python应用for循环临时变量作用域
大家好!如果你刚开始学习Python,可能会对for循环中临时变量的作用域感到好奇。下面通过一个简单的练习,帮助你理解这个概念。 代码呈现: i 0 for i in range(5):print(i)print(i)代码介绍: 首先我们初始化变量i 0然后进入for循环,这里i成为…...

设计模式——桥接设计模式(结构型)
摘要 桥接设计模式是一种结构型设计模式,用于将抽象与实现解耦,使二者可以独立变化。它通过将一个类拆分为“抽象”和“实现”两部分,并通过桥接关系组合,避免了类继承层次结构过于庞大。桥接模式包含抽象类、扩充抽象类、实现类…...

LLaDa——基于 Diffusion 的大语言模型 打平 LLama 3
这里分享一篇文章《Large Language Diffusion Models》,来自人民大学高领人工智能学院,一篇尝试改变传统自回归范(预测下一个token) LLM 架构,探索扩散模型在 LLM 上的作用,通过随机掩码-预测逆向思维&…...