JavaScript获取上传文件相关信息示例详解

目录
  • 前题场景
  • 处理方式
  • 图片文件
  • 音频文件
  • 判断处理
  • 分析总结

前题场景

在开发过程中,文件上传是再熟悉不过的场景了,但是根据实际使用情况对上传文件的限制又各有不同。需要对本地上传文件进行相应的限制处理,防止不符合规则或者要求的文件上传到云存储中,从而造成云盘资源空间浪费。

与此同时,也在给客户端使用文件信息之前做了一次数据过滤处理,减少客户端对文件资源的处理和校验。

处理方式

因为客户端使用后台管理上传的图片文件和音频文件时,为了优化展示效果和加载的速度,所以在后台管理系统上传处希望依据图片文件的宽高比例对文件大小做下相应的限制;

同时对上传的音频文件要依据音频文件的时长做些相应的限制,比如:在指定时长范围内的音频文件的文件大小做下对应的限制,符合要求文件大小的文件可以上传到云服务器,不符合要求的就要进行相应的文件上传拦截,并作出对应的提示,以便于使用者在操作上传文件时候可以依据指定的提示去筛选出符合要求的文件。

图片文件

通过创建图片文件对象来加载文件流的方式来获取图片文件的宽度和高度。

️有些情况下需要单独处理,把其他格式类型的文件通过强制修改后缀名的方式来达到转换文件的目的,此种方式最终会通过“image.onerror”事件来输出错误,在使用过程中可以使用该方法做下拦截处理。

/**
 * @description 获取图片宽度和高度
 * @param {Object} file 图片文件对象
 * @return {Object} {width: number, height: number} 图片宽度和高度
 *  */
const getImageRadio = file => {
    return new Promise((resolve, reject) => {
        // 创建读取文件对象
        const reader = new FileReader();
        // 读取文件对象
        reader.readAsDataURL(file);
        // 文件对象加载完成
        reader.onload = () => {
            // 创建image对象
            const imageEl = new Image();
            // 赋值src地址
            imageEl.src = reader.result;
            // 图片加载成功
            imageEl.onload = () => {
                let imgWH = {
                    with: imageEl.width,
                    height: imageEl.height
                };
                return resolve(imgWH);
            };
            // 图片加载失败
            imageEl.onerror = () => {
                return reject(null);
            };
        };
        // 文件对象加载失败
        reader.onerror = () => {
            return reject(null);
        };
    });
};

音频文件

通过创建音频文件流的方式来获取音频文件的时长「视频文件流同样适用此方法」

️有些情况下就是那其他格式类型的文件通过转换或者强制修改文件后缀名的方式来达到转换文件类型的目的,此方法在测试环节可能会出现,但是在平时使用过程过出现的概率不是很大,但是防止粗心的人或者其他用意的人采用此种方式,因此需要对失败事件“audioEl.onerror”进行监听,来优化判断逻辑,减少问题出现。

/**
 * @description 获取音频文件时长
 * @param {Object} file 音频文件对象
 * @return {Number}  duration 时长
 *  */
const getAudioDuration = file => {
    return new Promise((resolve, reject) => {
        // 创建URL对象
        const audioURL = URL.createObjectURL(file);
        // 创建audio对象
        const audioEl = new Audio(audioURL);
        // 元数据加载触发事件
        audioEl.onloadedmetadata = () => {
            // 读取文件音频时长
            const duration = audioEl.duration;
            return resolve(duration);
        };
        // 元数据加载失败
        audioEl.onerror = () => {
            return reject(null);
        };
    });
};

判断处理

此处只是做了基础的逻辑判断,后续若有其他需求,可以根据自身实际需求场景进行相应的修改;

此处封装的两个异步函数方法“获取图片文件的宽度和高度”和“获取音频文件的时长”,对基础格式的校验比较简单,后续可以根据实际情况做修改。

若是采用获取文件流的方式来获取想要的文件类型信息,建议采用“异步”的方式来加载文件。

/**
 * @description 判断文件类型
 * @param {Object} file 文件对象
 * @return {Object} file
 *  */
const checkFile = async file => {
    // 获取文件大小
    const fileSize = file.size || 0;
    // 获取文件类型
    const fileType = file.type;
    let isImage = false;
    let isAudio = false;
    // 判断文件类型
    if (fileType.includes("image/")) {
        // 图片文件
        if (fileType === "image/png") {
            // png图片
            isImage = true;
        }
    } else if (fileType.includes("audio/")) {
        // 音频文件
        if (fileType.includes("audio/mpeg")) {
            // mp3
            isAudio = true;
        }
    }
    // 判断图片
    if (isImage) {
        let imgRes = await getImageRadio(file);
    }
    // 判断音频
    else if (isAudio) {
        let audioRes = await getAudioDuration(file);
    }
    // 其他格式
    else {
      // 其他格式文件
    }
};

分析总结

通过此次文件上传处理分析,可以依据文件后缀名判断指定的文件格式类型,也可以通过上传的文件对象file.type”来获取文件类型。

两种方式都可以处理文件类型,早期开发,主要是通过判断文件后缀名的方式来区分文件类型,有些时候命名格式有些不规范,处理起相对来说容易出现差错。

此次判断采用的文件file对象的方式来判断文件类型。相对来说,文件后缀名方式判断文件类型比文件对象“file.type”方式获取文件类型来说稍微简单点,也容易判断些,但是在明明不规范的情况下容易产生问题。

总之来说,两种判断方式各有利弊,在使用过程中,可以根据自己的实际开发情况来决定采用哪种方式。

以上就是JavaScript获取上传文件相关信息示例详解的详细内容,更多关于JavaScript获取上传文件信息的资料请关注我们其它相关文章!

(0)

相关推荐

  • Javascript读取上传文件内容/类型/字节数

    在网站开发的某些情况下我们需要上传文件到服务器,在这个过程中可能会对文件做一定的限制,比如说文件格式,文件大小等,在一些情况下我们上传文件其实是为了获取其中的内容在前端区域展示,这个时候就不需要将文件上传到服务器,完全可以通过Javascript来获取上传文件内容然后进行展示,既加快了操作速度,也减轻了服务器的负载和存储.接下来就是一个实际操作的过程: 首先来看一下一个上传文件对象的属性: UI设计(React+Material-ui) ... const styles = theme => (

  • JavaScript文件上传的常见问题整理

    文件上传:<input type="file" /> (IE9及以下不支持下面这些功能,其它浏览器最新版本均已支持.) 1.允许上传文件数量 允许选择多个文件: <input type="file" multiple> 只允许上传一个文件: <input  type="file" single> 2.上传指定的文件格式 <input type="file" accept="i

  • js获取上传文件的绝对路径实现方法

    在html中 <input type="file" id="importFile" /> <input type="button" onclick="upload()"/> <script> function upload() { var filename = document.getElementById("importFile").value; // 这时的filen

  • javascript实现获取指定精度的上传文件的大小简单实例

    js实现获取指定精度的上传文件的大小,主要采用html和JavaScript,用浏览器运行下述代码,按照操作:选择文件->获得文件大小的顺序,即可. 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>获得文件大小</title> </head> <body> <f

  • Node.js上传文件功能之服务端如何获取文件上传进度

    内容概述 multer是常用的Express文件上传中间件.服务端如何获取文件上传的进度,是使用的过程中,很常见的一个问题.在SF上也有同学问了类似问题<nodejs multer有没有查看文件上传进度的方法?>.稍微回答了下,这里顺便整理出来,有同样疑问的同学可以参考. 下文主要介绍如何利用progress-stream获取文件上传进度,以及该组件使用过程中的注意事项. 利用progress-stream获取文件上传进度 如果只是想在服务端获取上传进度,可以试下如下代码.注意,这个模块跟Ex

  • javascript html5移动端轻松实现文件上传

    PC端上传文件多半用插件,引入flash都没关系,但是移动端要是还用各种冗余的插件估计得被喷死,项目里面需要做图片上传的功能,既然H5已经有相关的接口且兼容性良好,当然优先考虑用H5来实现. 用的技术主要是: ajax FileReader FormData HTML结构: <div class="camera-area"> <form enctype="multipart/form-data" method="post">

  • JavaScript获取上传文件相关信息示例详解

    目录 前题场景 处理方式 图片文件 音频文件 判断处理 分析总结 前题场景 在开发过程中,文件上传是再熟悉不过的场景了,但是根据实际使用情况对上传文件的限制又各有不同.需要对本地上传文件进行相应的限制处理,防止不符合规则或者要求的文件上传到云存储中,从而造成云盘资源空间浪费. 与此同时,也在给客户端使用文件信息之前做了一次数据过滤处理,减少客户端对文件资源的处理和校验. 处理方式 因为客户端使用后台管理上传的图片文件和音频文件时,为了优化展示效果和加载的速度,所以在后台管理系统上传处希望依据图片

  • TypeScript前端上传文件到MinIO示例详解

    目录 什么是MinIO? 本地Docker部署测试服务器 上传的API TypeScript实现 1. XMLHttpRequest 2. Fetch API 3. Axios 从后端获取临时上传链接 上传文件 踩过的坑 1. presignedPutObject方式上传提交的方法必须得是PUT 2. 直接发送File即可 3. 使用Axios上传的时候,需要自己把Content-Type填写成为file.type 示例代码 什么是MinIO? MinIO 是一款高性能.分布式的对象存储系统.

  • js前端上传文件缩略图技巧示例详解

    目录 引言 文件对象简介 Blob File FileReader FormData 文件对象之间的关系 缩略图的实现 总结 引言 通常情况下,前端提交给服务器的数据格式为JSON格式,但很多时候用户想上传自己的头像.视频等,这些非文本数据的时候,就不能直接以JSON格式上传到后端了. 当我们要获取用户上传的文件,可以使用input表单项,将type属性值设置为“file”. <form action=""> <input type="file"

  • JavaScript 上传文件限制参数案例详解

    项目场景: 1,上传文件限制 功能作用: 1,防止前端操作上传异常文件 2,限制符合的规则,优化展示模型 功能实现: 1,获取file实例 2,执行校验规则方法 代码如下: //大小限制 checkFileSize(file, rules) { return new Promise((resolve, reject) => { file.size / 1024 / 1024 > rules ? reject() : resolve() }).then( () => { return tr

  • Python Flask实现图片上传与下载的示例详解

    目录 1.效果预览 2.新增逻辑概览 3.tuchuang.py 逻辑介绍 3.1 图片上传 3.2 图片合法检查 3.3 图片下载 4.__init__.py 逻辑介绍 5.upload.html 介绍 5.1 upload Jinja 模板介绍 5.2 upload css 介绍(虚线框) 5.3 upload js 介绍(拖拽) 1.效果预览 我们基于 Flask 官方指导工程,增加一个图片拖拽上传功能,效果如下: 2.新增逻辑概览 我们在官方指导工程上进行增加代码,改动如下: 由于 fl

  • 利用jQuery异步上传文件的插件用法详解

    现在想实现用ajax来上传文件的功能,但是却发现Jquery自带的ajax方法只能上传文件名,而不能上传文件:用form提交虽然能够上传文件,但是却要刷新页面...多方查找下找到了一个可用的jQuery插件,刚好可以满足异步上传文件的要求. 代码 jquery.form.js 用法 这个插件是基于表单提交的,我们只要正常的写一段提交文件的表单,如: <form id="myForm" action="comment.php" method="post

  • Ajax实现上传图像功能的示例详解

    最终效果展示 xhr发起请求 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="widt

  • 使用Spring boot + jQuery上传文件(kotlin)功能实例详解

    文件上传也是常见的功能,趁着周末,用Spring boot来实现一遍. 前端部分 前端使用jQuery,这部分并不复杂,jQuery可以读取表单内的文件,这里可以通过formdata对象来组装键值对,formdata这种方式发送表单数据更为灵活.你可以使用它来组织任意的内容,比如使用 formData.append("test1","hello world"); 在kotlin后端就可以使用@RequestParam("test1") greet

  • JQuery.uploadify 上传文件插件的使用详解 for ASP.NET

    后来朋友推荐了一个这个叫uploadify的上传插件,似乎挺好,就到官方下了个示例运行,感觉挺好,自己再稍加美化一下就OK 了..! 接下来就讲讲使用过程吧: 1. 下载 官方网站:http://www.uploadify.com/ 直接下载:jquery.uploadify-v2.1.0.rar 我的Demo: MyUpload.rar                官方网站也有demo 下载解压后: 说明:它里面有demo  但是是PHP的,还有一个帮助文档:uploadify v2.1.0

  • Android实现上传文件到服务器实例详解

    本实例实现每隔5秒上传一次,通过服务器端获取手机上传过来的文件信息并做相应处理:采用Android+Struts2技术. 一.Android端实现文件上传 1).新建一个Android项目命名为androidUpload,目录结构如下: 2).新建FormFile类,用来封装文件信息 package com.ljq.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExce

随机推荐