【vue3+tauri+rust】如何实现下载文件mac+windows

项目背景:【vue3+tauri+rust】

由于Safari对于下载总是有诸多阻拦,目前需求windows+mac可以实现:

  1. 后端返回的url文件可以下载;
  2. 前端根据dom元素生成的PDF报告可以下载(无远程URL);
我的尝试:
  • 方法一:window.open(url) 。需要远程url可实现windows+1,但浏览器有不安全警告,且Mac无反应。❌
  • 方法二:利用tauri插件:
    • 安装 "@tauri-apps/plugin-opener": "^2.2.7",

    • import { openUrl } from '@tauri-apps/plugin-opener';

    • 使用 await openUrl(req_url);
      需要远程url,可实现windows+Mac+1,但浏览器有不安全警告。❌

  • 方法三:返回base64+转为blob+创建a标签点击:
const response = await invoke('get_req', { url: req_url, timeout: 30 });
const blob = base64ToBlob(response.data,'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
);
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = 'robot_template.xlsx';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);

可实现windows+1+2,不需要远程URL,但Mac无反应。❌

终极大绝招:

实现方式:前端save窗口获取filePath+Rust命令写入磁盘,完美避开浏览器拦截,且没有不安全提示,适合所有类型文件!!✅
需求1:

import { open, save } from '@tauri-apps/plugin-dialog';try {// res.data.b64 res.data.titleconst res = await Robot.template();if (res.success) {const base64 = res.data.b64;const fileName = res.data.title || 'robot_template.xlsx';// 获取路径const filePath = await save({defaultPath: fileName,filters: [{ name: 'Excel', extensions: ['xlsx'] }],});if (!filePath) return;// Rust写入await invoke('save_file', {filePath: filePath,base64Data: base64,});ElMessage.success(t('common.success'));}} catch (e) {ElMessage.error('下载失败' + e);}

需求2:

import { invoke } from '@tauri-apps/api/core';
import { save } from '@tauri-apps/plugin-dialog';
import jsPDF from 'jspdf';try {// 创建 PDFconst pdf = new jsPDF({orientation: 'portrait',unit: 'mm',format: 'a4',});// .....省略业务pdf处理逻辑// pdf.save(fileName); // Windows可以 Mac不可以// 唤起文件保存窗口 用户自定义保存路径const filePath = await save({defaultPath: fileName,filters: [{ name: 'PDF', extensions: ['pdf'] }],});if (!filePath) return; // 用户取消const dataUriString = pdf.output('datauristring');const base64 = dataUriString.split(',')[1];// Rust写入  await invoke('save_file', {filePath: filePath,base64Data: base64,});ElMessage.success(t('scene.report.export_success'));} finally {// 关闭加载提示loadingMessage.close();}

Rust新增:

// tauri.conf.json 
"plugins": {"opener": {"requireLiteralLeadingDot": false}}// http.rs
use std::fs::File;
use std::io::Write;
use base64::Engine;#[tauri::command]
pub fn save_file(filePath: String, base64Data: String) -> Result<String, String> {log::info!("写入文件传过来的参数:{filePath}");// 写入文件let decoded = base64::engine::general_purpose::STANDARD.decode(base64Data).map_err( |e| format!("Base64 解码失败: {}", e))?;let mut file = File::create(&filePath).map_err( |e| format!("创建文件失败:{}", e))?;file.write_all(&decoded).map_err( |e| format!("写入文件失败:{}", e))?;Ok(filePath)
}

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

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

相关文章

SQL 快速参考手册-SQL001

SQL 快速参考手册&#xff1a; 为方便快速学习和实践&#xff0c;提供了一份 SQL 快速参考手册&#xff0c;您可以打印出来随时查看&#xff0c;了解常见 SQL 命令的语法和用法。 SQL 数据类型 SQL 数据类型根据不同的数据库系统&#xff08;如 Microsoft Access、MySQL、SQL…

学习java集合

集合与数组的对比集合的长度可变, 数组的长度不可变集合实际上跟数组一样, 是一种容器, 可以存放数据数组可以直接存放基本数据类型和引用数据类型集合可以存放引用数据类型, 但是不能直接存放基本数据类型, 如果要存放基本数据类型, 需要变成一个包装类才行泛型: 限定集合中存…

python训练day49 CBAM

import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self, in_channels, ratio16):"""通道注意力机制初始化参数:in_channels: 输入特征图的通道数ratio: 降维比例&#xff0c;用于减少参数量&#xff0c;默认…

在小程序中实现实时聊天:WebSocket最佳实践

前言 在当今互联网应用中&#xff0c;实时通信已经成为一个标配功能&#xff0c;特别是对于需要即时响应的场景&#xff0c;如在线客服、咨询系统等。本文将分享如何在小程序中实现一个高效稳定的WebSocket连接&#xff0c;以及如何处理断线重连、消息发送与接收等常见问题。 W…

Python网络爬虫编程新手篇

网络爬虫是一种自动抓取互联网信息的脚本程序&#xff0c;广泛应用于搜索引擎、数据分析和内容聚合。这次我将带大家使用Python快速构建一个基础爬虫&#xff0c;为什么使用python做爬虫&#xff1f;主要就是支持的库很多&#xff0c;而且同类型查询文档多&#xff0c;在同等情…

LeetCode.283移动零

题目链接&#xff1a;283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行…

2025年7月4日漏洞文字版表述一句话版本(漏洞危害以及修复建议),通常用于漏洞通报中简洁干练【持续更新中】,漏洞通报中对于各类漏洞及修复指南

漏洞及修复指南 一、暗链 危害&#xff1a;攻击者通过技术手段在用户网页中插入隐藏链接或代码&#xff0c;并指向恶意网站&#xff0c;可导致用户信息泄露、系统感染病毒&#xff0c;用户访问被劫持至恶意网站&#xff0c;泄露隐私或感染恶意软件&#xff0c;被黑客利用进行…

python --飞浆离线ocr使用/paddleocr

依赖 # python3.7.3 paddleocr2.7.0.2 paddlepaddle2.5.2 loguru0.7.3from paddleocr import PaddleOCR import cv2 import numpy as npif __name__ __main__:OCR PaddleOCR(use_doc_orientation_classifyFalse, # 检测文档方向use_doc_unwarpingFalse, # 矫正扭曲文档use…

数据结构与算法:贪心(三)

前言 感觉开始打cf了以后贪心的能力有了明显的提升,让我们谢谢cf的感觉场。 一、跳跃游戏 II class Solution { public:int jump(vector<int>& nums) {int n=nums.size();//怎么感觉这个题也在洛谷上刷过(?)int cur=0;//当前步最远位置int next=0;//多跳一步最远…

【Redis篇】数据库架构演进中Redis缓存的技术必然性—高并发场景下穿透、击穿、雪崩的体系化解决方案

&#x1f4ab;《博主主页》&#xff1a;    &#x1f50e; CSDN主页__奈斯DB    &#x1f50e; IF Club社区主页__奈斯、 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对…

Docker 实践与应用案例

引言 在当今的软件开发和部署领域&#xff0c;高效、可移植且一致的环境搭建与应用部署是至关重要的。Docker 作为一款轻量级的容器化技术&#xff0c;为解决这些问题提供了卓越的方案。Docker 通过容器化的方式&#xff0c;将应用及其依赖项打包成一个独立的容器&#xff0c;…

《论三生原理》以非共识路径实现技术代际跃迁‌?

AI辅助创作&#xff1a; 《论三生原理》以颠覆传统数学范式的非共识路径驱动多重技术代际跃迁&#xff0c;其突破性实践与争议并存&#xff0c;核心论证如下&#xff1a; 一、技术代际跃迁的实证突破‌ ‌芯片架构革新‌ 为华为三进制逻辑门芯片提供理论支撑&#xff0c;通过对…

一体机电脑为何热度持续上升?消费者更看重哪些功能?

一体机电脑&#xff08;AIO&#xff0c;All-in-One&#xff09;将主机硬件与显示器集成于单一机身。通常仅需连接电源线&#xff0c;配备无线键盘、鼠标即可启用。相比传统台式电脑和笔记本电脑&#xff0c;选购一体机的客户更看重一体机的以下特点。 一体机凭借其节省空间、简…

无人机载重模块技术要点分析

一、技术要点 1. 结构设计创新 双电机卷扬系统&#xff1a;采用主电机&#xff08;张力控制&#xff09;和副电机&#xff08;卷扬控制&#xff09;协同工作&#xff0c;解决绳索缠绕问题&#xff0c;支持30米绳长1.2m/s高速收放&#xff0c;重载稳定性提升。 轴双桨布局…

【大模型推理】工作负载的弹性伸缩

基于Knative的LLM推理场景弹性伸缩方案 1.QPS 不是一个好的 pod autoscaling indicator 在LLM推理中&#xff0c; 为什么 2. concurrency适用于单次请求资源消耗大且处理时间长的业务&#xff0c;而rps则适合较短处理时间的业务。 3.“反向弹性伸缩”的概念 4。 区分两种不同的…

STM32F103_Bootloader程序开发12 - IAP升级全流程

导言 本教程使用正点原子战舰板开发。 《STM32F103_Bootloader程序开发11 - 实现 App 安全跳转至 Bootloader》上一章节实现App跳转bootloader&#xff0c;接着&#xff0c;跳转到bootloader后&#xff0c;下位机要发送报文‘C’给IAP上位机&#xff0c;表示我准备好接收固件数…

AI驱动的未来软件工程范式

引言&#xff1a;迈向智能驱动的软件工程新范式 本文是一份关于构建和实施“AI驱动的全生命周期软件工程范式”的简要集成指南。它旨在提供一个独立、完整、具体的框架&#xff0c;指导组织如何将AI智能体深度融合到软件开发的每一个环节&#xff0c;实现从概念到运维的智能化…

Hawk Insight|美国6月非农数据点评:情况远没有看上去那么好

7月3日&#xff0c;美国近期最重要的劳动力数据——6月非农数据公布。在ADP遇冷之后&#xff0c;市场对这份报告格外期待。 根据美国劳工统计局公布报告&#xff0c;美国6月非农就业人口增加 14.7万人&#xff0c;预期 10.6万人&#xff0c;4月和5月非农就业人数合计上修1.6万人…

Python 的内置函数 reversed

Python 内建函数列表 > Python 的内置函数 reversed Python 的内置函数 reversed() 是一个用于序列反转的高效工具函数&#xff0c;它返回一个反向迭代器对象。以下是关于该函数的详细说明&#xff1a; 基本用法 语法&#xff1a;reversed(seq)参数&#xff1a;seq 可以是…

沟通-交流-说话-gt-jl-sh-goutong-jiaoliu-shuohua

沟通,先看|问状态(情绪) 老婆下班回家,我说,到哪儿了,买点玉米哦;她说你为啥不买, 我说怎么如此大火气, 她说你安排我&#xff0c;我不情愿;你怎么看 和女人沟通不能目标优先 先问状态并表达关心 用感谢代替要求&#xff08;“你上次买的玉米特别甜&#xff0c;今天突然又馋了…