【Tauri2】049——upload

news2025/6/4 14:06:30

前言

这篇就看看一个简单地插件——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<()> 
  1. url:需要下载的网址
  2. file_path:保存的路径
  3. headers:请求头
  4. body:请求体
  5. 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) * 100
                    setProgress(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这个函数,笔者就不演示了,主要是不知道上传什么。

就这样。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4、数据标注的武林秘籍:Label-Studio vs CVAT vs Roboflow

开篇痛点&#xff1a;90%的模型效果取决于数据质量 "标注3小时&#xff0c;训练5分钟"——这是很多AI工程师的真实写照。上周有位读者训练YOLOv12时发现&#xff0c;同样的代码&#xff0c;换批数据mAP直接跌了15%&#xff0c;根本原因是标注不规范&#xff01;本文…

Linux 基础IO(上)

目录 前言 重谈文件 文件操作 1.打开和关闭 2.对文件打开之后操作 理解文件fd 1.文件fd的分配规则与重定向 2.理解shell中的重定向 3.关于Linux下一切皆文件 关于缓冲区 1.为什么要有缓冲区 2.缓冲区刷新策略的问题 3.缓冲区的位置 前言 本篇到了我们linux中的文件…

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 的矩形岛屿&#xff0c;与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界&#xff0c;而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights &#xff0c; hei…

《Python基础》第2期:环境搭建

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

WSL 安装 Debian 12 后,Linux 如何安装 curl , quickjs ?

在 WSL 的 Debian 12 系统中安装 curl 非常简单&#xff0c;你可以直接使用 APT 包管理器从官方仓库安装。以下是详细步骤&#xff1a; 1. 更新软件包索引 首先确保系统的包索引是最新的&#xff1a; sudo apt update2. 安装 curl 执行以下命令安装 curl&#xff1a; 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…

YOLOX 的动态标签分类(如 SimOTA)与 Anchor-free 机制解析2025.5.29

YOLOX 的动态标签分类&#xff08;如 SimOTA&#xff09;与 Anchor-free 机制是其核心改进中的两个关键部分&#xff0c;它们在目标检测中的作用和实现方式存在显著差异。以下从原理、实现细节及效果三个方面进行详细对比&#xff1a; 一、核心原理与目标 1. Anchor-free 机制…

724.寻找数组的中心下标前缀和

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

软考-系统架构设计师-第十六章 层次式架构设计理论与实践

层次式架构设计理论与实践 16.2 表现层框架设计16.3 中间层框架设计16.4 数据访问层设计16.5 数据架构规划与设计16.6 物联网层次架构设计 软件体系结构为软件系统提供了结构、行为和属性的高级抽象&#xff0c;由构成系统的元素描述这些元素的相互作用、指导元素集成的模式以及…

Docker学习笔记:基础知识

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

5.2 初识Spark Streaming

在本节实战中&#xff0c;我们初步探索了Spark Streaming&#xff0c;它是Spark的流式数据处理子框架&#xff0c;具备高吞吐量、可伸缩性和强容错能力。我们了解了Spark Streaming的基本概念和运行原理&#xff0c;并通过两个案例演示了如何利用Spark Streaming实现词频统计。…

Python趣学篇:交互式词云生成器(jieba + Tkinter + WordCloud等)

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、为什么要做词云&#xff1f;让文字"活"起来&#xff01;二、核心…

理解解释器架构:原理、组成与运行机制全解析

目录 前言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全流程解析&#xff0c;备考攻略 快捷目录 华为OD全流程解析&#xff0c;备考攻略一、什么是华为OD&#xff1f;二、什么是华为OD机试&#xff1f;三、华为OD面试流程四、华为OD薪资待遇及职级体系五、ABCDE卷类型及特点六、题型与考点七、机试备考策略八、薪资与转正九、…

设计模式——桥接设计模式(结构型)

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

LLaDa——基于 Diffusion 的大语言模型 打平 LLama 3

这里分享一篇文章《Large Language Diffusion Models》&#xff0c;来自人民大学高领人工智能学院&#xff0c;一篇尝试改变传统自回归范&#xff08;预测下一个token&#xff09; LLM 架构&#xff0c;探索扩散模型在 LLM 上的作用&#xff0c;通过随机掩码-预测逆向思维&…

2. 数据结构基本概念 (2)

本文部分ppt、视频截图来自&#xff1a;[青岛大学-王卓老师的个人空间-王卓老师个人主页-哔哩哔哩视频] 1. 数据结构基本概念 1.1 数据类型和抽象数据类型 (1) 数据类型(Data Type) 概念 数据类型是一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称。 在使用…

STM32F407寄存器操作(多通道单ADC+DMA)

1.前言 又是半年没更新了&#xff0c;趁着端午放假有点时间&#xff0c;并且最近项目要用这块知识&#xff0c;我就顺带研究一下ADC吧。 一般来说ADC主要用法包含了1.单通道软件触发&#xff08;这是最简单和最常用的用法&#xff09;2.单通道多次采集&#xff08;需要快速采…

基于React和TypeScript的金融市场模拟器开发与模式分析

基于React和TypeScript的金融市场模拟器开发与模式分析 项目概述 本项目开发了一个基于React和TypeScript的金融市场模拟器&#xff0c;通过模拟订单流和价格发现机制&#xff0c;重现了真实市场的动态特性。该模拟器不仅提供了实时价格图表、订单簿和交易功能&#xff0c;还…