JS-本地文件上传

 由于不需要原上传文件的样式,所以自己书写了一个按钮触发文件上传,并将原本的样式隐藏

<!doctype html>
<html><head><meta charset="utf-8"><title>文件传输</title>
</head><body><input type="file" id="fileInput" style="display: none;"/><button id="uploadButton">每日销售收款报表</button><script>document.getElementById('uploadButton').addEventListener('click', function() {document.getElementById('fileInput').click() // 触发文件上传});document.getElementById('fileInput').addEventListener('change', function() {let file = this.files[0] // 获取选中的文件console.log(file)});</script>
</body></html>

打印出来的file就是所上传的文件。

浏览上传的文件

出于安全考虑,window.open 不能直接用来打开 <input type="file"> 元素获取的文件。

如果想使用window.open浏览文件可以使用 URL.createObjectURL() 方法创建一个指向文件内容的URL,然后使用 window.open 打开。

let fileURL = URL.createObjectURL(file)
window.open(fileURL)

报错

如发现报错:window.open blocked due to active file chooser.

原因:浏览器通常会在有文件上传的情况下阻止弹出新窗口,以防止用户在不经意间更改文件或者导致页面不稳定。

解决:可以使用一个定时器(setTimeout)来延迟window.open()的调用

setTimeout(function() { window.open(fileURL) 
}, 100); // 延时时间可以根据需要调整

乱码

如果浏览txt文件是浏览器直接打开浏览;其他文件则是下载浏览

打开txt文件时会有跨域的问题,从而导致乱码,有一个解决方案是上传的txt文件为带有 BOM 的 UTF-8编码格式

多次上传

如果想多次上传同一个文件,因为两次上传的文件重复了,不会触发change事件,所以需要在每次上传结束后,把<input type="file"/>的value设置为空

总结

最后总结代码为:

<!doctype html>
<html><head><meta charset="utf-8"><title>文件传输</title>
</head><body><input type="file" id="fileInput" style="display: none;"/><button id="uploadButton">每日销售收款报表</button><script>document.getElementById('uploadButton').addEventListener('click', function() {document.getElementById('fileInput').click() // 触发文件上传});document.getElementById('fileInput').addEventListener('change', function() {let file = this.files[0] // 获取选中的文件if (file) {let fileURL = URL.createObjectURL(file) //转换成 window.open 可以打开的URLsetTimeout(function() { // 解决window.open blocked due to active file chooser.问题window.open(fileURL) }, 100); // 延时时间可以根据需要调整}this.value=''// 重复上传同一个文件});</script>
</body></html>

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

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

相关文章

Java笔记 --- 七、多线程

七、多线程 线程 线程是操作系统能够运行调度的最小单位 被包含在进程之中&#xff0c;是进程的实际运行单位 应用软件中相互独立&#xff0c;可以同时运行的功能 每一个线程都有自己的栈 并发和并行 并发&#xff1a;在同一时刻&#xff0c;有多个指令在单个CPU上交替执…

解析与模拟常用字符串函数strcpy,strcat,strcmp,strstr(一)

今天也是去学习了一波字符串函数&#xff0c;想着也为了加深记忆&#xff0c;所以写一下这篇博客。既帮助了我也帮助了想学习字符串函数的各位。下面就开始今天的字符串函数的学习吧。 目录 strcpy与strncpy strcat与strncat strcmpy strstr strcpy与strncpy 在 C 语言中&…

数据结构·复杂度讲解

1. 什么是数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。 数据结构是用来在内存中管理数据的&#xff0c;类似的&#xff0c;我们熟悉的文件或数据库是在硬盘中管理数据的。内存中的数据是带点…

【k8s系列】(202402) 证书apiserver_client_certificate_expiration_seconds

apiserver_client_certificate_expiration_second证书定义的位置&#xff1a;kubernetes/staging/src/k8s.io/apiserver/pkg/authentication/request/x509/x509.go at 244fbf94fd736e94071a77a8b7c91d81163249d4 kubernetes/kubernetes (github.com) apiserver_client_certi…

机器学习逻辑回归模型训练与超参数调优 ##3

文章目录 [TOC]基于Kaggle电信用户流失案例数据&#xff08;可在官网进行下载&#xff09;逻辑回归模型训练逻辑回归的超参数调优 基于Kaggle电信用户流失案例数据&#xff08;可在官网进行下载&#xff09; 数据预处理部分可见&#xff1a; 机器学习数据预处理方法&#xff0…

【Linux系统化学习】自定义简易shell

目录 环境变量在进程替换中的继承 在当前进程中添加环境变量 putenv函数 环境变量被继承的原因 使用ecexle传递环境变量 传递自己的环境变量表 自定义简易的shell 获取主机、使用者、工作目录 获取命令 切割分解命令 创建子进程执行命令 内建命令的特殊处理 完整代…

AI改编游戏大电影《使命召唤:幽灵重生》(下)

AI改编游戏大电影《使命召唤&#xff1a;幽灵重生》&#xff08;下&#xff09; 幽灵重生携生化武器毁灭人类&#xff0c;普莱斯上尉点上雪茄拿起武器&#xff0c;英雄再次迎来使命的召唤&#xff01; 《使命召唤&#xff1a;幽灵重生》&#xff08;下&#xff09;&#xff1a…

6.s081 学习实验记录(五)traps

文章目录 一、RISC-V assembly简介问题 二、Backtrace简介注意实验代码实验结果 三、Alarm简介注意实验代码实验结果 一、RISC-V assembly 简介 git checkout traps&#xff0c;切换到traps分支user/call.c 文件在我们输入 make fs.img 之后会被汇编为 call.asm 文件&#xf…

【VTKExamples::PolyData】第二十一期 ImplicitPolyDataDistance

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例ImplicitPolyDataDistance,并解析接口vtkImplicitPolyDataDistance,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)…

docker自定义镜像并使用

写在前面 本文看下如何自定义镜像。 ik包从这里 下载。 1&#xff1a;自定义带有ik的es镜像 先看下目录结构&#xff1a; /opt/program/mychinese [rootlocalhost mychinese]# ll total 16 -rw-r--r-- 1 root root 1153 Feb 5 04:18 docker-compose.yaml -rw-rw-r-- 1 el…

Docker进阶篇-compose容器编排

一、描述 Docker-Compose是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Compose是Docker公司推出的一个工具软件&#xff0c;可以管理多个Docker容器组成一个应用。需要定义 一个YAML格式的配置文件docker-compose.yml&#xff0c;配置好多个容器…

【iOS ARKit】人形遮挡

人形遮挡简介 在 AR系统中&#xff0c;计算机通过对设备摄像头采集的图像进行视觉处理和组织&#xff0c;建立起实景空间&#xff0c;然后将生成的虚拟对象依据几何一致性原理嵌入到实景空间中&#xff0c;形成虚实融合的增强现实环境&#xff0c;再输出到显示系统中呈现给使用…