vue文件上传-所有文件选项去掉

效果:

缘由:

<template><div class="upload-container"><div class="upload-box" @click="triggerFileInput" @dragover.prevent @drop="handleDrop"><p>点击或拖放文件到这里上传</p><input type="file" ref="fileInput" @change="handleFileChange" accept=".kml,.shp" hidden /></div><div v-if="file" class="file-info"><p>文件名:{{ file.name }}</p><p>文件大小:{{ formatSize(file.size) }}</p><button @click="uploadFile">上传文件</button></div></div>
</template><script setup>
import { ref } from 'vue';const file = ref(null);
const fileInput = ref(null);// 文件大小格式化
const formatSize = (size) => {return size < 1024 ? `${size} B` :size < 1048576 ? `${(size / 1024).toFixed(1)} KB` :`${(size / 1048576).toFixed(1)} MB`;
};// 触发文件选择
const triggerFileInput = () => {fileInput.value.click();
};// 处理文件选择
const handleFileChange = (event) => {const selectedFile = event.target.files[0];validateFile(selectedFile);
};// 处理文件拖放
const handleDrop = (event) => {const droppedFile = event.dataTransfer.files[0];validateFile(droppedFile);
};// 文件验证函数
const validateFile = (selectedFile) => {if (selectedFile && (selectedFile.name.endsWith('.kml') || selectedFile.name.endsWith('.shp'))) {file.value = selectedFile;} else {alert("请上传 .kml 或 .shp 文件");}
};// 上传文件
const uploadFile = () => {if (!file.value) return;const formData = new FormData();formData.append('file', file.value);fetch('/upload', {method: 'POST',body: formData,}).then(response => response.json()).then(data => {alert("文件上传成功");resetFile();}).catch(error => {alert("上传失败,请重试");});
};// 重置文件信息
const resetFile = () => {file.value = null;fileInput.value.value = ''; // 重置 input 文件值
};
</script><style scoped>
.upload-container {display: flex;flex-direction: column;align-items: center;margin-top: 20px;
}.upload-box {width: 300px;height: 150px;border: 2px dashed #008fe9;border-radius: 10px;display: flex;align-items: center;justify-content: center;color: #333;cursor: pointer;text-align: center;transition: background-color 0.3s;
}.upload-box:hover {background-color: #f0f8ff;
}.file-info {margin-top: 10px;text-align: center;
}.file-info button {background-color: #008fe9;color: #fff;border: none;padding: 8px 16px;border-radius: 4px;cursor: pointer;transition: background-color 0.3s;
}.file-info button:hover {background-color: #005f99;
}
</style>

在前端页面解析,使用原生的input或者el-uploadaccept属性只能进行文件类型校验阻止上传,在文件上传选择窗口还是有所有选项(*.*)这个选项,怎么禁用这个浏览器或操作系统自带的文件选择窗口中的所有选项?

思路:

经查阅资料了解,Chrome 86 版本后引入了一项新的 File System API,可以在调用 showOpenFilePicker 方法时指定 excludeAcceptAllOption 参数为 false 禁用掉“所有文件”

缺点:兼容性,目前仅 Chrome 86+ 版本支持,其他浏览器都未支持这一特性。

知识抢先看:

File System API 是一种现代的 Web API,允许 Web 应用更直接地访问用户的文件系统。它可以在前端应用中提供类似桌面应用的文件管理功能,支持文件的创建、读写、删除等操作。

  1. 打开文件选择器:showOpenFilePicker() 用于打开文件选择器,用户可以选择文件或文件夹。
    async function openFile() {try {const [fileHandle] = await window.showOpenFilePicker({types: [{description: 'Text files',accept: { 'text/plain': ['.txt'] }}],excludeAcceptAllOption: true,multiple: false});const file = await fileHandle.getFile();console.log('Selected file:', file);} catch (error) {console.error('Error:', error);}
    }
    
  2. 读取文件内容:通过 fileHandle.getFile() 可以获得用户选择的文件,之后可以使用 File API 读取文件内容。
    async function readFile(fileHandle) {const file = await fileHandle.getFile();const text = await file.text();console.log('File content:', text);
    }
    
  3. 写入文件内容:createWritable() 用于获取一个可写入的流,允许将数据写入文件。
    async function writeFile(fileHandle, content) {const writable = await fileHandle.createWritable();await writable.write(content);await writable.close();
    }
    
  4. 保存文件:通过 showSaveFilePicker() 让用户选择保存位置并创建文件。
    async function saveFile() {const options = {types: [{description: 'Text files',accept: { 'text/plain': ['.txt'] }}]};const fileHandle = await window.showSaveFilePicker(options);await writeFile(fileHandle, 'Hello, world!');
    }
    
  5. 访问目录:showDirectoryPicker() 可以让用户选择一个文件夹,并在该文件夹内创建、读取或删除文件。
    async function openDirectory() {const directoryHandle = await window.showDirectoryPicker();for await (const entry of directoryHandle.values()) {console.log(entry.kind, entry.name);}
    }
    

应用:

使用 showOpenFilePicker API 实现文件选择,并禁用“所有文件”选项。

<template><el-button @click="openFilePicker">自定义文件选择器</el-button></template><script setup>
async function openFilePicker () {try {const [fileHandle] = await window.showOpenFilePicker({types: [{description: '矢量文件',accept: {'*/*': ['.kml', '.shp'] // 接受所有 MIME 类型,但限制扩展名}}],excludeAcceptAllOption: true, // 禁用“所有文件”选项multiple: false // 限制单个文件});const file = await fileHandle.getFile();console.log('选择文件:', file);// 实现想要的操作逻辑} catch (error) {console.error('文件获取错误:', error);}
}
</script>

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

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

相关文章

JS | 如何规范 JavaScript 的注释

目录 一、使用单行注释 二、多行注释的使用 三、使用JSDoc风格的注释 四、采用一致的注释习惯 规范JavaScript的注释方法包括使用单行注释、多行注释、使用JSDoc风格的注释以及采用一致的注释习惯。其中&#xff0c;使用JSDoc风格的注释是为了提高代码的可读性和维护性&…

数据分析-43-某社交app用户行为示例数据

关注公众号&#xff1a;『AI学习星球』 算法学习、4对1辅导、论文辅导或核心期刊可以通过公众号滴滴我 文章目录 背景描述数据说明分析数据相关系数查看各功能属性的分布各功能路径流量排名 TOP10留存率排名 TOP10 背景描述 本数据集是某社交APP一定时间内用户留存的分类示例数…

Linux中emqx集中报错解决方案

在centos8上面部署emqx5.5,过程中有许多问题。 第一种文件配置 node {name "emqx-nameIP" #名称此处IP仅用于标识cookie "GR7aqjZzt0IfcEEw" #此处数据自己设置data_dir "…

socket 编程

Linux C语言 server 端&#xff08;TCP&#xff09;&#xff1a; // socketServer.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> // 提供 close、read 和 write &#xff08;这里通过 send 间接使用&#x…

国内常见DNS

国内常见DNS 1.阿里DNS 223.5.5.5 223.6.6.62.百度DNS 180.76.76.763.114DNS 114.114.114.114 114.114.115.1154.字节DNS 180.184.1.1 180.184.2.25.GoogleDNS 8.8.8.8个人综合排名是 阿里&#xff08;223.5.5.5&#xff09;>腾讯&#xff08;1.12.12.12&#xff09; ≈…

3D医学影像开发入门<四>:VS2019 + Qt5.15.2 + MITK-v2021.10编译及环境配置

1、MITK介绍 1.1 MITK概述 MITK 是一个开源框架&#xff0c;最初是作为德国癌症研究中心医学和生物信息学部 &#xff08;MBI&#xff09; 博士生的通用框架开发的。MITK 旨在支持开发具有高度交互性的领先医学成像软件。 MITK 几乎重复使用了 VTK 和 ITK 中的任何内容。因此&…

项目模块1~12总结:服务器大模块梳理

一、思维导图 二、设计思路 1、各种回调函数梳理 服务器里面包含了监听套接字和监听到的通信套接字&#xff08;新连接&#xff09;&#xff0c;我们要对这两种套接字进行设置回调函数&#xff0c;其中监听套接字里面只要设置读回调&#xff0c;通信套接字要设置5种回调&…

023集——CAD 窗体交互、多段线进行翻转、错误提示(CAD—C#二次开发入门)

效果如下&#xff1a; 窗体模块&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;…

照明灯具哪个品牌好?2024照明灯十大知名品牌大公开

在现代生活中&#xff0c;护眼台灯已经成为许多加班族的必备神器。但是&#xff0c;市场上的护眼台灯种类繁多&#xff0c;价格也各有不同&#xff0c;我们也不能每一个都买回家进行测试&#xff0c;看看照明灯具哪个品牌好&#xff1f;别担心&#xff0c;我帮你们找了&#xf…

FileLink跨网数据摆渡系统:打破网络隔阂,轻松实现跨网络数据传输

在数字化时代&#xff0c;跨网络、跨区域的数据传输成为了企业和个人信息流通的重大挑战。而如今&#xff0c;FileLink跨网数据摆渡系统的问世&#xff0c;彻底解决了这一难题&#xff0c;帮助用户实现快速、安全、无缝的跨网络数据传输。 1. 跨网络数据传输的痛点 随着企业信…

C语言 — 指针的进阶

文章目录 前言一、字符指针二、指针数组三、数组指针数组名 与 &数组名 四、指针传参二维数组传参 五、函数指针结语 前言 通过前面的关于指针的学习&#xff0c;我们了解了指针的一些个特性。本篇文章我们将深入指针&#xff0c;挖掘指针更深处的知识。 在开始之前&#…

【机器学习导引】ch4-决策树

基本流程 两个需要解决的问题 属性顺序&#xff1a; 问题&#xff1a;哪些属性在前面&#xff0c;哪些属性在后面&#xff1f;这个问题指的是在处理数据或进行排序时&#xff0c;需要确定属性的排列顺序&#xff0c;以便更好地进行数据处理或分析。 属性选择&#xff1a; 问题…

[ DOS 命令基础 4 ] DOS 命令命令详解-端口进程相关命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

博客系统(SpringBoot项目)

文章目录 一、项目开发的流程二、项目开发2.1 准备工作2.2 开发公共模块&#xff1a;把能写的先写了什么是公共模块model层mapper层定义统一返回结果统一异常处理 2.2 博客列表页2.3 更改显示的时间2.4 博客详情页2.5 登录Session式登录方法分析使用Token来实现登录 2.6 强制登…

软件设计师笔记-数据结构

数据结构 数据元素的集合及元素间的相互关系和构造方法。 线性表的存储结构 顺序存储链式存储 单链表节点 typedef struct node { int data; struct node *link; }NODE, *LinkList; 双向链表 每个节点有两个指针&#xff0c;分别指出直接前驱和直接后继。 循环链表 尾…

LangChain Ollama实战文献检索助手(一)环境配置和输入输出解析

挑选合适的模型 调用API需要花钱&#xff0c;因此在搭建阶段最佳的方法是利用Ollama部署本地CPU推理的轻量化大模型。大模型选择可以参照hugging face的榜单open-llm-leaderboard。 这里对我来说&#xff0c;要选择的模型需要满足 1.ollama上有的模型。 2.推理速度快&#xff…

在docker中搭建redis哨兵环境

文章目录 一、引言二、环境准备前提条件目录结构 三、配置文件1. 主节点配置文件 sentinel-master.conf2. 从节点配置文件3. 哨兵配置文件 sentinel.conf4. Docker Compose 文件 四、启动 Docker Compose五、验证哨兵机制1. 检查主节点状态2. 检查从节点状态3. 检查哨兵状态4. …

上线不出网机器

不出网机器介绍 上线不出网机器是我们常见的问题&#xff0c;如何在内网中实现不出网机器的上线呢&#xff0c;我们分为了如下的形式&#xff0c;根据之前所学的内容我们开始进行实验&#xff0c;常见的网络拓扑如下 情况分类 上线不出网机器一般是指B区域的电脑上线到CS工具或…

Modbus解析流程全面升级:体验全新核心与终极优化!

01 前言 本文章原文发表于我的微信公众号&#xff0c;请大家关注阅读&#xff0c;涉及的源代码等都在公众号&#xff0c;请搜索公众号&#xff1a; 智能家居NodeRed和HomeAssistant 即可关注。 02 全面改进的解析流程 前面发布过的Modbus解析流程在经过多个设备测试后发现存…

Python邮差:如何用代码精确投递商品快递费用的密信

目录 一、准备工作 二、编写API请求脚本 三、解析与处理快递费用数据 四、案例应用&#xff1a;模拟电商平台的快递费用计算 五、自动化邮件通知 六、总结 在电子商务的广阔天地里&#xff0c;精确计算并快速传递商品快递费用是一项至关重要的任务。作为Python邮差&#…