前端使用原生JS怎么上传本地路径的文件到后端【附源码】

本文不使用<input type="file">等前端上传组件

一、为什么不能使用本地文件路径上传?

前端不能直接根据本地文件路径(例如 C:\Users\Username\Documents\image.jpg)上传文件到后端服务器,原因主要在于浏览器的安全策略限制。以下是几个关键点解释这一限制:

  1. 同源策略(Same-origin policy):浏览器实施的安全策略之一,旨在防止不同源的网页读取对方的资源。这意味着网页上的JavaScript无法访问本地文件系统中的文件,除非这些文件是通过用户交互(如 <input type="file">)明确选择的。

  2. 沙箱模型(Sandbox model):现代浏览器运行JavaScript代码时,使用沙箱环境来隔离网页内容,确保网页脚本不能无授权地访问用户计算机上的文件或其他敏感资源。

  3. 安全限制:直接允许JavaScript访问和上传本地文件路径可能会引发严重的安全问题,比如恶意脚本可以未经用户许可就窃取用户硬盘上的私人数据。

  4. 文件API:为了支持文件上传,HTML5引入了File API,允许Web应用在用户选择文件后读取文件内容,而不是直接操作文件路径。用户通过 <input type="file"> 选择文件后,浏览器提供文件的临时虚拟路径(例如,一个Blob对象或File对象),这些对象可以在JavaScript中操作并上传到服务器,但不会暴露实际的本地文件系统路径。

二、实操

1、后端转base64

我们根据本地的路径地址转换为base64编码传到前端

    public static String convertImageToBase64(String imagePath) {try {// 读取图片文件BufferedImage bufferedImage = ImageIO.read(new File(imagePath));// 创建输出流ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();// 将图片写入输出流,格式为JPEGImageIO.write(bufferedImage, "jpg", byteArrayOutputStream);// 将字节数组转换为Base64编码byte[] imageBytes = byteArrayOutputStream.toByteArray();return Base64.getEncoder().encodeToString(imageBytes);} catch (IOException e) {e.printStackTrace();return null;}}

2、前端转换为Blob对象

从后端传过来的base64编码转换为Blob对象。

    // 将base64编码的数据转换为Blob对象function base64toBlob(base64Data, contentType = '') {// 设置内容类型contentType = contentType || '';// 将base64编码的数据转换为字节字符const byteCharacters = atob(base64Data);// 创建字节数组const byteNumbers = new Array(byteCharacters.length);// 遍历字节字符,转换为字节数字for (let i = 0; i < byteCharacters.length; i++) {byteNumbers[i] = byteCharacters.charCodeAt(i);}// 将字节数字转换为Uint8Arrayconst byteArray = new Uint8Array(byteNumbers);// 创建并返回Blob对象return new Blob([byteArray], {type: contentType});}

3、上传

再进行对应数据的上传,切记不能在同一个请求里面多次调用请求方法。所以我们需要进行封装。

    async function uploadFileWithFetch(fileBlob, imagePath) {const formData = new FormData();formData.append('file', fileBlob, imagePath);try {
//文件上传请求路径const response = await fetch('/car/distinguish/upload', {method: 'POST',body: formData, // 自动设置Content-Type为multipart/form-data});if (!response.ok) {throw new Error(`HTTP error! status: ${response.status}`);}const result = await response.json();console.log('图片上传成功', result.msg + ":" + result.plateNumber);return result;} catch (error) {console.error('图片上传失败', error);}}

在后端我们的 file 里面就可以拿到我们前端上传的文件了。

    @RequestMapping("upload")public Result upload(MultipartFile file)

三、应用场景

这个应用场景主要指的是前端上传文件到后端的流程,具体包括但不限于以下几种:

  1. 社交媒体:用户上传个人头像、分享照片、视频或文档到自己的动态或时间线。

  2. 在线文档编辑与存储服务:用户上传Word、Excel、PDF等文档到云端,以便在线预览、编辑和存储。

  3. 电子商务:商家上传商品图片、用户上传购物评价中的图片或视频证据。

  4. 内容管理系统(CMS):网站管理员或编辑上传文章配图、多媒体内容到网站后台。

  5. 云存储服务:用户上传个人或工作文件到Dropbox、Google Drive、阿里云OSS等云存储平台。

  6. 简历投递与在线应聘:求职者上传简历、作品集或项目演示文件到招聘网站或公司门户。

  7. 教育平台:学生上传作业、论文或项目报告,教师上传教学资源。

  8. 博客与论坛:用户上传文章插图、论坛附件或个人签名图片。

  9. 医疗健康平台:患者上传医疗报告、影像资料,医生上传处方或诊断说明。

  10. 政府与企业服务:公民或员工上传申请材料、税务文件或企业报告到在线服务平台。

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

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

相关文章

使用java远程提交flink任务到yarn集群

使用java远程提交flink任务到yarn集群 背景 由于业务需要&#xff0c;使用命令行的方式提交flink任务比较麻烦&#xff0c;要么将后端任务部署到大数据集群&#xff0c;要么弄一个提交机&#xff0c;感觉都不是很离线。经过一些调研&#xff0c;发现可以实现远程的任务发布。…

LOTO示波器软件PC缓存(波形录制与回放)功能

当打开PC缓存功能后, 软件将采用先进先出的原则排队对示波器采集的每一帧数据, 进行帧缓存。 当发现屏幕中有感兴趣的波形掠过时, 鼠标点击软件的(暂停)按钮, 可以选择回看某一帧的波形。一帧数据的量 是 当前用户选择时基档位缓冲区总数据大小。不同时基档位缓冲区大小不同&am…

谈谈std::map的lower_bound

我们知道std::map内部是一个红黑树&#xff0c;放到std::map里的数据等有一个能比较大小的方法。它相当于java里面的TreeMap。 它里面有个lower_bound方法&#xff0c;返回一个迭代器&#xff0c;它指向map里第一个大于等于参数的元素。 方法的签名很简单&#xff0c;但是在不同…

富格林:有效预防黑幕阻挠被骗

富格林指出&#xff0c;在投资领域&#xff0c;现货黄金是一种备受推崇的贵金属投资品种。倘若能有效预防黑幕阻挠被骗的情况&#xff0c;事实上现货黄金是很多投资者的“理想型”。然而要想有效地预防黑幕阻挠被骗&#xff0c;就需要掌握足够多的投资技巧。为此&#xff0c;富…

Milvus 基本概念

Milvus 是一个开源的向量数据库&#xff0c;专门用于高效地存储、管理和检索大规模向量数据。它基于 Apache 许可证 2.0 版本发布&#xff0c;由 Zilliz 公司开源并维护。 Milvus 的设计理念是为了解决向量数据存储和检索的挑战。在许多应用中&#xff0c;向量数据是一种重要的…

强化学习——马尔可夫过程的理解

目录 一、马尔可夫过程1.随机过程2.马尔可夫性质3.马尔可夫过程4.马尔可夫过程示例 参考文献 一、马尔可夫过程 1.随机过程 随机过程是概率论的“动态”版本。普通概率论研究的是固定不变的随机现象&#xff0c;而随机过程则专注于那些随时间不断变化的情况&#xff0c;比如天…

C# 使用channel 实现Plc 异步任务之间的通信

channel 通信的例子: using ConsoleApp2; using System.Collections.Concurrent; using System.Threading.Channels;var queue = new BlockingCollection<Message>(new ConcurrentQueue<Message>());var opt = new BoundedChannelOptions(10) {FullMode = BoundedC…

Linux环境快速部署mysql5.7

1 网络下载rpm包 wget -c https://repo.huaweicloud.com/mysql/Downloads/MySQL-5.7/mysql-5.7.37-1.el7.x86_64.rpm-bundle.tar2 解压 tar xf mysql-5.7.37-1.el7.x86_64.rpm-bundle.tar3 数据库之间会冲突因此需要卸载mariadb-libs yum remove mariadb-libs4 安装 如果没有…

R语言两种方法实现随机分层抽样

为了减少数据分布的不平衡&#xff0c;提供高样本的代表性&#xff0c;可将数据按特征分层一定的层次&#xff0c;在每个层次抽取一定量的样本&#xff0c;为分层抽样。分层抽样的特点是将科学分组法与抽样法结合在一起&#xff0c;分组减小了各抽样层变异性的影响&#xff0c;…

HTTP协议及Python实现

最近的项目需要频繁在前后端之间传输数据&#xff0c;本篇主要介绍HTTP协议以及数据传输方法。 1 HTTP协议 1.1 http协议简介 HTTP(Hypertext Transfer Protocol)是一种用于传输超文本数据的应用层协议。它是万维网上数据交换的基础&#xff0c;定义了客户端和服务器之间进行通…

C语言指针详解(三)

目录 前言 一. 回调函数是什么&#xff1f; 1.定义 2. 代码示例&#xff1a;计数器 2.1 使用回调函数改造前 2.2 使用回调函数改造后 二. qsort使用举例 1. qsort介绍 2. 使用qsort函数排序整型数据 3. 使用qsort排序结构体数据 三. qsort函数的模拟实现 四. sizeo…

代码随想录:螺旋矩阵II相关题目推荐(54、LCR146)

59.螺旋矩阵II 题目 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]] 代码&#xff08;新解法&am…

MyBatis——MyBatis 参数处理

一、单个简单类型参数 简单类型包括&#xff1a; byte short int long float double char Byte Short Integer Long Float Double Character String java.util.Date java.sql.Date parameterType 属性&#xff1a;告诉 MyBatis 参数的类型 MyBatis 自带类型自动推断机制…

LLM应用-prompt提示:生成搜索相关问题、生成回答格式包含参考资料

参考: https://isou.chat/ (AI回答与相关问题都是根据问题的搜索引擎结果结合大模型生成的) prompt参考: https://github.com/yokingma/search_with_ai/blob/6d32aa8f05f5f6ee12b5204787035b3f7797c22a/src/prompt.ts#L8 ##rag 根据搜索结果知识回答RagQueryPrompt = ` …

在Go语言中,可以这样使用Json

在Go语言中&#xff0c;处理JSON数据通常涉及编码&#xff08;将Go结构体转换为JSON字符串&#xff09;和解码&#xff08;将JSON字符串转换为Go结构体&#xff09;。Go标准库中的encoding/json包提供了这些功能。第三方插件可以使用"github.com/goccy/go-json"也有同…

Git | git log 和 git status 的区别

如是我闻&#xff1a; git log和git status是Git中的两个非常有用的命令&#xff0c;它们用于不同的目的&#xff0c;并提供不同类型的信息。 git log git log命令用于显示一个或多个分支的提交历史记录。这个命令会列出提交历史&#xff0c;包括每次提交的SHA-1哈希值、提交…

程控水冷阻性负载主要工作方式

程控水冷阻性负载是一种先进的电力设备&#xff0c;主要用于电力系统的测试和研究。它的主要工作方式是通过控制水冷系统的温度&#xff0c;来模拟不同的阻性负载条件&#xff0c;从而对电力设备进行各种性能测试。 首先&#xff0c;我们需要了解什么是阻性负载。阻性负载是指那…

博弈智能的特点

博弈智能是指通过算法和模型对博弈过程进行分析和决策的智能系统。在博弈中&#xff0c;各方参与者追求自身利益和目标&#xff0c;会采取各种策略来达到自己的目标。其中&#xff0c;包括了一些不正当手段&#xff0c;如诡计和欺骗&#xff08;诡&#xff09;&#xff08;诈&a…

代码随想录算法训练营Day 42| 动态规划part04 | 01背包问题理论基础I、01背包问题理论基础II、416. 分割等和子集

代码随想录算法训练营Day 42| 动态规划part04 | 01背包问题理论基础I、01背包问题理论基础II、416. 分割等和子集 文章目录 代码随想录算法训练营Day 42| 动态规划part04 | 01背包问题理论基础I、01背包问题理论基础II、416. 分割等和子集01背包问题理论基础一、01背包问题二、…

WSL设置启动时自动启动docker服务或其他服务

方式一: Windows系统的WSL,当windows关机再开机后,WSL等于是重新开机的,默认情况下,不会启动Docker服务。例如在Ubuntu 22.04中,需要使用命令 service docker start来启动。由于我习惯关机断电,因此每天开机打开WSL后都要手动输入这个命令,非常麻烦。所以找了一个方法…