js 中 file 文件 应用

news2024/12/27 1:49:43

文章目录

    • 文件上传
      • File 对象基本属性
      • 文件上传
      • 大文件上传
      • 文件格式校验
        • 通过 type 属性校验图片格式
        • 通过文件名扩展名校验
    • 文件解析
      • 一、处理图片文件流(以 `Blob` 格式接收文件流为例)
      • 二、处理文本文件流
      • 三、处理 PDF 文件流(借助 PDF.js 库来展示,需先引入 PDF.js 相关脚本)
    • base64 读取及转换
      • 方法一:通过`FileReader`读取本地图片文件转换为Base64
      • 方法二:获取页面上已存在图片元素并转换为Base64

文件上传

以下是关于前端 File 对象的基本属性、文件上传、大文件上传以及格式校验的相关内容及实例:

File 对象基本属性

在前端,当用户通过 <input type="file"> 元素选择文件后,可以获取到对应的 File 对象,它包含了诸多有用的属性:

  • name:表示文件名,包含文件的扩展名,例如 "example.jpg"
  • size:以字节为单位返回文件的大小,比如一个 500KB 的文件,其 size 值大约就是 500 * 1024 字节(因为 1KB = 1024 字节)。
  • type:返回文件的 MIME 类型,像图片文件常见的有 "image/jpeg"(JPEG 图片)、"image/png"(PNG 图片),文本文件可能是 "text/plain" 等。
  • lastModified:返回文件最后修改时间的时间戳(从 1970 年 1 月 1 日 00:00:00 UTC 到文件最后修改时间的毫秒数)。

示例代码,获取文件的基本属性:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
</head>

<body>
    <input type="file" id="fileInput">
    <button onclick="getFileInfo()">获取文件信息</button>
    <script>
        function getFileInfo() {
            const fileInput = document.getElementById('fileInput');
            const file = fileInput.files[0];
            if (file) {
                console.log('文件名:', file.name);
                console.log('文件大小:', file.size, '字节');
                console.log('文件类型:', file.type);
                console.log('最后修改时间:', new Date(file.lastModified)
                .toLocaleString());
            }
        }
    </script>
</body>

</html>

文件上传

通常是将用户选择的文件发送到后端服务器进行保存或进一步处理,基本步骤如下:

  1. 创建 FormData 对象:用于模拟表单数据,方便将文件数据和其他可能的额外数据(比如文件名、描述等额外字段)一起发送。
  2. 添加文件到 FormData:把通过 <input type="file"> 获取到的 File 对象添加进去。
  3. 发起 XMLHttpRequest 或使用 fetch API 发送请求:将包含文件的 FormData 发送到后端指定的接口。

以下是使用 fetch API 的示例,假设后端接口地址为 "/upload"

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
</head>

<body>
    <input type="file" id="fileInput">
    <button onclick="uploadFile()">上传文件</button>
    <script>
        async function uploadFile() {
            const fileInput = document.getElementById('fileInput');
            const file = fileInput.files[0];
            if (file) {
                const formData = new FormData();
                formData.append('file', file);
                try {
                    const response = await fetch('/upload', {
                        method: 'POST',
                        body: formData
                    });
                    const result = await response.json();
                    console.log(result);
                } catch (error) {
                    console.error('上传出错:', error);
                }
            }
        }
    </script>
</body>

</html>

大文件上传

大文件上传需要考虑到避免一次性将整个大文件读入内存,防止浏览器内存溢出等问题,常见的做法是采用切片上传,步骤大致如下:

  1. 将大文件进行切片:按照一定的大小(比如每片 1MB 或者其他合适的大小)把文件切割成多个小的文件片段。
  2. 为每个切片标记顺序等信息:方便后端接收后能正确地将切片组合还原成完整文件,例如可以给每个切片添加序号字段。
  3. 依次上传切片:逐个将切片发送到后端,一般可以通过循环和记录上传进度等机制来实现。
  4. 后端处理切片并合并还原文件:后端接收到切片后,按照约定的顺序等规则将它们合并成原始的大文件。

以下是一个简单的大文件切片上传的前端示例(仅示意切片部分和简单的上传逻辑,完整功能还需结合后端完善),假设切片大小设为 1MB(1024 * 1024 字节):

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
</head>

<body>
    <input type="file" id="bigFileInput">
    <button onclick="uploadBigFile()">上传大文件</button>
    <script>
        function uploadBigFile() {
            const fileInput = document.getElementById('bigFileInput');
            const file = fileInput.files[0];
            if (file) {
                const chunkSize = 1024 * 1024; // 1MB 切片大小
                const chunks = [];
                let start = 0;
                while (start < file.size) {
                    const end = Math.min(start + chunkSize, file.size);
                    const chunk = file.slice(start, end);
                    chunks.push(chunk);
                    start = end;
                }
                // 此处可以添加代码来逐个上传切片,比如通过循环调用上传函数,并且处理进度等情况
                console.log('文件已切片,共', chunks.length, '个切片');
            }
        }
    </script>
</body>

</html>

文件格式校验

可以通过 File 对象的 type 属性或者文件扩展名来校验文件格式是否符合要求,以下是几种常见的校验方式示例:

通过 type 属性校验图片格式
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
</head>

<body>
    <input type="file" id="imageFileInput">
    <button onclick="checkImageFormat()">校验图片格式</button>
    <script>
        function checkImageFormat() {
            const fileInput = document.getElementById('imageFileInput');
            const file = fileInput.files[0];
            if (file) {
                const allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
                if (allowedTypes.includes(file.type)) {
                    console.log('图片格式符合要求');
                } else {
                    console.log('图片格式不符合要求');
                }
            }
        }
    </script>
</body>

</html>
通过文件名扩展名校验
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
</head>

<body>
    <input type="file" id="fileInputForExtensionCheck">
    <button onclick="checkFileExtension()">校验文件扩展名</button>
    <script>
        function checkFileExtension() {
            const fileInput = document.getElementById('fileInputForExtensionCheck');
            const file = fileInput.files[0];
            if (file) {
                const fileName = file.name;
                const allowedExtensions = ['.jpg', '.png', '.txt'];
                const fileExtension = fileName.substring(fileName.lastIndexOf('.'));
                if (allowedExtensions.includes(fileExtension.toLowerCase())) {
                    console.log('文件扩展名符合要求');
                } else {
                    console.log('文件扩展名不符合要求');
                }
            }
        }
    </script>
</body>

</html>

上述示例展示了前端 File 对象相关操作的基础实现,实际应用中,根据具体的业务需求和后端配合情况,还需要进一步完善逻辑、处理错误以及优化用户体验等。

文件解析

以下是几种前端对后端返回的文件流进行解码显示的常见实例,分别针对不同类型的文件(图片、文本文件等)进行说明:

一、处理图片文件流(以 Blob 格式接收文件流为例)

当后端返回图片文件流时,前端可以将其转换为可显示的图片元素(如 <img> 标签来展示),示例代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
</head>

<body>
    <img id="imageDisplay" src="" alt="显示图片">
    <script>
        // 模拟后端返回的文件流数据,这里先创建一个图片的 Blob 对象示例,实际中通常通过 AJAX 等方式获取后端返回数据
        const imageBlob = new Blob([/* 这里可以放入图片的二进制数据,示例简化省略具体数据 */], { type: 'image/jpeg' });

        const imageUrl = URL.createObjectURL(imageBlob);
        const imageElement = document.getElementById('imageDisplay');
        imageElement.src = imageUrl;

        // 注意,在合适的时候(比如页面卸载等情况),需要释放这个临时的 URL 对象,避免内存泄漏
        window.addEventListener('unload', function () {
            URL.revokeObjectURL(imageUrl);
        });
    </script>
</body>

</html>

在实际应用中,通常会使用 fetch 或者 XMLHttpRequest 等方式从后端获取文件流数据并转换为 Blob,以下是使用 fetch 来获取后端返回的图片文件流并显示的完整示例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
</head>

<body>
    <img id="imageDisplay" src="" alt="显示图片">
    <script>
        fetch('后端图片文件流接口地址', {
            method: 'GET',
            // 根据后端要求设置相应的请求头,比如认证相关的、指定返回格式等
            headers: {
                'Authorization': 'Bearer your_token'
            }
        })
           .then(response => response.blob())
           .then(imageBlob => {
                const imageUrl = URL.createObjectURL(imageBlob);
                const imageElement = document.getElementById('imageDisplay');
                imageElement.src = imageUrl;
                window.addEventListener('unload', function () {
                    URL.revokeObjectURL(imageUrl);
                });
            })
           .catch(error => {
                console.error('获取图片文件流出错:', error);
            });
    </script>
</body>

</html>

二、处理文本文件流

对于后端返回的文本文件流,前端可以将其读取并展示在页面上(比如显示在 <textarea> 中),示例如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
</head>

<body>
    <textarea id="textDisplay" rows="10" cols="50"></textarea>
    <script>
        // 模拟通过 AJAX 获取后端返回的文本文件流数据,转换为文本并显示,
        // 以下先简化用一个文本 Blob 示例
        const textBlob = new Blob([/* 这里放入文本的二进制数据,示例简化省略 */]
        , { type: 'text/plain' });

        const reader = new FileReader();
        reader.onload = function (e) {
            const textArea = document.getElementById('textDisplay');
            textArea.value = e.target.result;
        };
        reader.readAsText(textBlob);

        // 如果是通过 fetch 等真实获取后端数据,示例如下:
        fetch('后端文本文件流接口地址', {
            method: 'GET'
        })
           .then(response => response.blob())
           .then(textBlob => {
                const reader = new FileReader();
                reader.onload = function (e) {
                    const textArea = document.getElementById('textDisplay');
                    textArea.value = e.target.result;
                };
                reader.readAsText(textBlob);
            })
           .catch(error => {
                console.error('获取文本文件流出错:', error);
            });
    </script>
</body>

</html>

三、处理 PDF 文件流(借助 PDF.js 库来展示,需先引入 PDF.js 相关脚本)

如果后端返回的是 PDF 文件流,想要在前端展示,可以利用 PDF.js 库实现,以下是基本的示例代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <script src="
    https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.11.338/pdf.min.js"></script>
</head>

<body>
    <canvas id="pdfCanvas"></canvas>
    <script>
        // 模拟通过 AJAX 获取后端返回的 PDF 文件流数据,转换为可显示的 PDF,
        // 先简化示例为一个 PDF Blob
        const pdfBlob = new Blob([/* 这里放入 PDF 的二进制数据,示例简化省略 */],
         { type: 'application/pdf' });

        const url = URL.createObjectURL(pdfBlob);

        pdfjsLib.getDocument(url).promise.then(function (pdf) {
            pdf.getPage(1).then(function (page) {
                const canvas = document.getElementById('pdfCanvas');
                const context = canvas.getContext('2d');
                const viewport = page.getViewport({ scale: 1 });
                canvas.width = viewport.width;
                canvas.height = viewport.height;
                const renderContext = {
                    canvasContext: context,
                    viewport: viewport
                };
                page.render(renderContext);
            });
        });

        window.addEventListener('unload', function () {
            URL.revokeObjectURL(url);
        });
    </script>
</body>

</html>

同样,如果使用 fetch 等方式真实从后端获取 PDF 文件流,只需把上述模拟 Blob 的部分替换为实际的 fetch 请求及处理逻辑即可。

以上这些实例展示了不同类型文件流在前端解码显示的常见做法,实际应用中,需要根据具体的后端接口规范以及业务场景进行相应的调整和完善,比如处理请求错误、设置合适的请求头、考虑文件较大时的加载和显示优化等情况。

base64 读取及转换

以下是几种前端将图片转换为Base64编码的常见方法示例:

方法一:通过FileReader读取本地图片文件转换为Base64

这种方式适用于用户从本地选择图片后,在前端将其转换为Base64编码,方便后续展示、上传等操作。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
</head>

<body>
    <input type="file" id="fileInput" />
    <img id="imageDisplay" src="" alt="显示图片" />
    <script>
        const fileInput = document.getElementById('fileInput');
        fileInput.addEventListener('change', function (e) {
            const file = e.target.files[0];
            if (file) {
                const reader = new FileReader();
                reader.onloadend = function () {
                    const base64Data = reader.result;
                    const imageElement = document.getElementById('imageDisplay');
                    imageElement.src = base64Data;
                };
                reader.readAsDataURL(file);
            }
        });
    </script>
</body>

</html>

在上述代码中:

  1. 首先通过 document.getElementById 获取页面上的文件选择输入框元素。
  2. 给输入框添加 change 事件监听器,当用户选择文件后触发该事件。
  3. 在事件处理函数中,获取用户选择的文件对象(这里假设只选择一个文件,即取 files[0])。
  4. 创建 FileReader 对象,它用于异步读取文件内容。
  5. FileReaderonloadend 事件绑定回调函数,当文件读取完成(成功或失败都会触发该事件结束)后,从 reader.result 中获取到Base64编码的数据(readAsDataURL 方法会将文件内容读取为 data URL 格式,本质就是Base64编码的字符串加上特定的前缀标识文件类型等信息)。
  6. 最后将获取到的Base64编码数据设置到 <img> 标签的 src 属性上,实现图片的展示,也就完成了图片到Base64的转换及利用。

方法二:获取页面上已存在图片元素并转换为Base64

如果页面上已经有图片元素(例如通过 <img> 标签加载显示的图片),想要获取其Base64编码,可以按照以下示例代码操作:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
</head>

<body>
    <img id="existingImage" src="example.jpg" alt="示例图片" />
    <button id="convertButton">转换为Base64</button>
    <textarea id="base64Output" rows="5" cols="50"></textarea>
    <script>
        const convertButton = document.getElementById('convertButton');
        const base64Output = document.getElementById('base64Output');
        const existingImage = document.getElementById('existingImage');

        convertButton.addEventListener('click', function () {
            const canvas = document.createElement('canvas');
            canvas.width = existingImage.width;
            canvas.height = existingImage.height;
            const context = canvas.getContext('2d');
            context.drawImage(existingImage, 0, 0);
            const base64Data = canvas.toDataURL();
            base64Output.value = base64Data;
        });
    </script>
</body>

</html>

代码逻辑如下:

  1. 先获取页面上的相关元素,包括要转换的图片元素、转换按钮以及用于显示Base64编码结果的文本框。
  2. 给转换按钮添加点击事件监听器,当点击按钮时执行以下操作:
    • 创建一个 <canvas> 元素,设置其宽度和高度与要转换的图片元素尺寸一致。
    • 获取 <canvas>2d 绘图上下文。
    • 使用 context.drawImage 方法将图片绘制到 <canvas> 上。
    • 最后通过 <canvas> 元素的 toDataURL 方法获取绘制内容对应的Base64编码数据,并将其赋值到文本框的 value 属性中显示出来,从而完成了图片到Base64编码的转换并展示结果。

以上两种方法可以根据不同的应用场景,方便地在前端实现图片到Base64编码的转换操作,常用于图片的本地处理、预上传准备等情况。

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

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

相关文章

LabVIEW MathScript工具包对运行速度的影响及优化方法

LabVIEW 的 MathScript 工具包 在运行时可能会影响程序的运行速度&#xff0c;主要是由于以下几个原因&#xff1a; 1. 解释型语言执行方式 MathScript 使用的是类似于 MATLAB 的解释型语言&#xff0c;这意味着它不像编译型语言&#xff08;如 C、C 或 LabVIEW 本身的 VI&…

基于eFramework车控车设中间件介绍

车设的发展&#xff0c;起源于汽车工业萌芽之初&#xff0c;经历了机械式操作的原始粗犷&#xff0c;到电子式调控技术的巨大飞跃&#xff0c;到如今智能化座舱普及&#xff0c;远程车控已然成为汽车标配&#xff0c;车设功能选项也呈现出爆发式增长&#xff0c;渐趋多元繁杂。…

使用 AWR 进行 Exadata 性能诊断 - 2018版

本文和之前的使用 AWR 进行 Exadata 性能诊断是非常类似的&#xff0c;理论部分几乎一样&#xff0c;但案例部分是不同的&#xff0c;其价值也在于此。前文是基于Exadata X10&#xff0c;本文是基于Exadata X5。当然&#xff0c;型号并不重要&#xff0c;重要的是分析过程。 本…

【AI系统】计算与调度

计算与调度 上一篇文章我们了解了什么是算子&#xff0c;神经网络模型中由大量的算子来组成&#xff0c;但是算子之间是如何执行的&#xff1f;组成算子的算法逻辑跟具体的硬件指令代码之间的调度是如何配合&#xff1f;这些内容将会在本文进行深入介绍。 计算与调度 计算与…

JavaSE学习心得(APL与算法篇)

常用APL和常见算法 前言 常用APL Math System Runtime Object ​编辑浅克隆 深克隆 Objects Biginteger 构造方法 成员方法 底层存储方式 Bigdecimal 构造方法 Bigdecimal的使用 底层存储方式 ​编辑正则表达式 两个判断练习 两个爬取练习 贪婪爬取和非贪…

C++ ——— 引用的概念以及特性

目录 引用的概念 引用在实际代码中的作用 引用的特性 1. 引用在定义时必须初始化 2. 一个变量可以有多个引用 3. 可以给别名再次取别名&#xff0c;或者多次取别名 4. 引用一旦引用了实体&#xff0c;就不能再引用其他实体了 引用的概念 引用不是新定义一个变量&#x…

Linux-异步IO和存储映射IO

异步IO 在 I/O 多路复用中&#xff0c;进程通过系统调用 select()或 poll()来主动查询文件描述符上是否可以执行 I/O 操作。而在异步 I/O 中&#xff0c;当文件描述符上可以执行 I/O 操作时&#xff0c;进程可以请求内核为自己发送一个信号。之后进程就可以执行任何其它的任务…

嵌入式入门Day23

数据结构Day4 操作受限的线性表栈基本概念顺序栈顺序栈结构创建顺序栈判空和判满栈扩容入栈出栈遍历销毁栈 链式栈队列基本概念顺序队列循环顺序队列定义循环队列的创建循环顺序队列的判空和判满循环顺序队列的入队循环顺序队列的遍历循环顺序队列的出队循环顺序队列的销毁 链式…

C语言实验 一维数组

时间:2024.12.3 一、实验 7-1 交换最小值和最大值 #include<stdio.h> int main() {int n, a[10], i, min = 0, max = 0;scanf("%d", &n);for (i = 0; i < n; i++){scanf("%d",&a[i]);}for (i = 0; i < n; i++){if (a[min] > a[i…

聚合支付系统官方个人免签系统三方支付系统稳定安全高并发

系统采用fastadmin框架独立全新开发&#xff0c;安全稳定,系统支持代理、商户、码商等业务逻辑。 针对最近一-些JD&#xff0c;TB等业务定制&#xff0c;子账号业务逻辑API 非常详细&#xff0c;方便内置对接! 注意&#xff1a;系统没有配置文档很使用教程&#xff0c;不清楚…

HTMLCSS 奇幻森林:小熊的甜蜜蛋糕派对大冒险

这个 HTML 页面包含了一个背景、多个下落的蛋糕图片和一个左右移动的loopy图片,实现了一个小熊吃蛋糕的效果 演示效果 HTML&CSS <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>ideal life</title><style…

电脑关机的趣味小游戏——system函数、strcmp函数、goto语句的使用

文章目录 前言一. system函数1.1 system函数清理屏幕1.2 system函数暂停运行1.3 system函数电脑关机、重启 二、strcmp函数三、goto语句四、电脑关机小游戏4.1. 程序要求4.2. 游戏代码 总结 前言 今天我们写一点稍微有趣的代码&#xff0c;比如写一个小程序使电脑关机&#xf…

OpenSSL 自建CA 以及颁发证书(网站部署https双向认证)

前言 1、前面写过一篇 阿里云免费ssl证书申请与部署&#xff0c;大家可以去看下 一、openssl 安装说明 1、这部分就不再说了&#xff0c;我使用centos7.9&#xff0c;是自带 openssl的&#xff0c;window的话&#xff0c;要去下载安装 二、CA机构 CA机构&#xff0c;全称为…

在M3上面搭建一套lnmp环境

下载docker-desktop 官网下载docker-desktop 切换镜像源 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://docke…

WebSocket 通信说明与基于 ESP-IDF 的 WebSocket 使用

一、 WebSocket 出现的背景 最开始 客户端&#xff08;Client&#xff09; 和 服务器&#xff08;Server&#xff09; 通信使用的是 HTTP 协议&#xff0c;HTTP 协议有一个的缺陷为&#xff1a;通信只能由客户端&#xff08;Client&#xff09;发起。 在一些场景下&#xff0…

linux(centos) 环境部署,安装JDK,docker(mysql, redis,nginx,minio,nacos)

目录 1.安装JDK (非docker)1.1 将文件放在目录下&#xff1a; /usr/local/jdk1.2 解压至当前目录1.3 配置环境变量 2.安装docker2.1 验证centos内核2.2 安装软件工具包2.3 设置yum源2.4 查看仓库中所有docker版本&#xff0c;按需选择安装2.5 安装docker2.6 启动docker 并 开机…

CODESYS可视化秒表分批计时详细制作案例(一)

#制作一个在可视化界面可用于秒表计时的详细案例# 前言: 在电脑和手机的时钟上,都有一个秒表计时的功能。除此之外,在赛事上,也有更为专业的秒表计时器设备。举一反三,那么对于工控设备,为了衡量生产效率和节拍,引入了"Cycle Time(CT)"的概念,我们可以通…

openGauss开源数据库实战十八

文章目录 任务十八 openGauss逻辑结构:构:用户和权眼管理任务目标实施步骤一、准备工作二、用户和角色管理1.使用CREATE USER语句创建用户2.使用CREATE ROLE语句创建用户3.删除用户和角色 三、权限管理1.系统权限清理工作 任务十八 openGauss逻辑结构:构:用户和权眼管理 任务目…

Scratch游戏推荐 | 我的世界:平台冒险——像素世界的全新挑战! ⛏️

&#x1f3ae; Scratch游戏推荐 | 我的世界&#xff1a;平台冒险——像素世界的全新挑战&#xff01; ⛏️&#x1f30d; 今天给大家推荐一款精彩绝伦的Scratch平台冒险游戏——《我的世界&#xff1a;平台冒险 – 第二章》&#xff01;由atomicmagicnumber制作&#xff0c;这…

【java-数据结构篇】揭秘 Java LinkedList:链表数据结构的 Java 实现原理与核心概念

我的个人主页 我的专栏&#xff1a;Java-数据结构&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 目录 1. Java LinkedList 基础 1.1 LinkedList 简介 1.2 LinkedList 的实现原理 1.3 LinkedList 与 ArrayList 的区别 2. 链表基础 2.1 链…