当前位置: 首页 > news >正文

大文件分片上传

分片:

      // 获取文件对象const inputFile = document.querySelector('input[type="file"]');// 设置分片大小:5MBconst CHUNK_SIZE = 5 * 1024 * 1024;// 文件上传事件inputFile.onchange = async (e) => {// 获取文件信息const file = e.target.files[0];// 获取文件分片信息const chunks = await cutFile(file, CHUNK_SIZE);};// 获取文件所有分片信息async function cutFile(file, chunkSize = 5 * 1024 * 1024) {// 计算分片数量:文件大小除以分片大小然后在向上取整const chunkCount = Math.ceil(file.size / chunkSize);// 获取所有分片信息let chunks = [];for (let i = 0; i < chunkCount; i++) {// 获取单个分片信息const chunk = await createChunk(file, i, chunkSize);chunks.push(chunk);}return chunks;}// 获取文件单个分片信息import SparkMD5 from "sparkmd5.js"; // 计算hash值的第三方库async function createChunk(file, index, chunkSize = 5 * 1024 * 1024) {return new Promise((resolve) => {const start = index * chunkSize; // 当前分片的起始字节位置const end = Math.min(start + chunkSize, file.size); // 当前分片的结尾字节位置const blob = file.slice(start, end); // 分片内容const spark = new SparkMD5.ArrayBuffer(); // 创建处理hash值的实例对象,使用二进制数据获取MD5的值const fileReader = new FileReader(); // 创建浏览器内置的文件读取器,将二进制片段读取成内存中的数据// 绑定文件读取器,读取完成事件fileReader.onload = (e) => {spark.append(e.target.result); // 将二进制数据的结果追加到MD5的计算缓存中resolve({index,start,end,blob,hash: spark.end() // 计算并返回当前分片的hash值});};// 文件读取器开始读取分片数据fileReader.readAsArrayBuffer(blob);});}

优化:由于计算hash值是一个运算过程(CPU 密集型任务)很耗时并且js是单线程语言,所以必须要算完一个分片后 CPU 存在空闲才能去算下一个分片的 hash 值。

  • 如何解决:IO密集型操作可以用并发处理(promise.all),CPU密集型任务只能开多线程优化。
// 获取计算机内核数量 - 线程数量const THREAD_COUNT = navigator.hardwareConcurrency || 4;// 获取文件所有分片信息async function cutFile(file, chunkSize = 5 * 1024 * 1024) {return new Promise((resolve) => {// 计算分片数量:文件大小除以分片大小然后在向上取整const chunkCount = Math.ceil(file.size / chunkSize);// 计算每个线程可以分配分片的数量:总的分片数量除以总的线程数量然后在向上取整const threadChunkCount = Math.ceil(chunkCount / THREAD_COUNT);// 开启其他线程任务const result = [];let finishCount = 0;for (let i = 0; i < THREAD_COUNT; i++) {// 开启其他线程,并设置线程是一个module模块,支持导入const worker = new Worker("./worker.js", { type: "module" });// 向其他线程传递消息const start = i * threadChunkCount;const end = Math.min(start + threadChunkCount, chunkCount);worker.postMessage({file,start,end,chunkSize});// 从其他线程获取消息,确保接收到的信息顺序是正确的,则使用下标接收信息worker.onmessage = (e) => {worker.terminate(); // 结束当前线程result[i] = e.data; // 当前线程内的所有分片信息都保存起来finishCount++;// 当其他线程全部结束则返回所有分片信息,扁平化数组if (finishCount === THREAD_COUNT) resolve(result.flat());};}});}// 其他线程内部执行的内容:worker.js中onmessage = async (e) => {const { file, start, end, chunkSize } = e.data; // 获取主线程传递的消息// 获取当前线程内部的所有分片信息let result = [];for (let i = 0; i < end; i++) {// 获取单个分片信息const prom = createChunk(file, i, chunkSize);result.push(prom);}const chunks = await Promise.all(result); // 等待分片信息全部生成完成postMessage(chunks); // 向主线程传递当前线程分片信息};

断点续传:在本地存储中保存已上传的信息,下次重新上传的时候去检查本地记录,存在则跳过当前分片

      async function resumeUpload(file) {const chunkSize = 5 * 1024 * 1024;const totalChunks = Math.ceil(file.size / chunkSize);const fileId = generateFileId(file.name, file.size);// 1. 首先检查本地存储的上传记录let uploadedChunks = getLocalUploadProgress(fileId) || [];// 2. 如果本地没有记录,再请求服务器验证if (uploadedChunks.length === 0) {try {const response = await axios.get(`/upload-status?fileId=${fileId}`);uploadedChunks = response.data.uploadedChunks || [];// 将服务器记录保存到本地saveLocalUploadProgress(fileId, uploadedChunks);} catch (error) {console.error("获取上传状态失败,从头开始上传", error);uploadedChunks = [];}}// 3. 上传缺失的分片for (let i = 0; i < totalChunks; i++) {if (uploadedChunks.includes(i)) {console.log(`分片 ${i} 已上传,跳过`);continue;}const chunk = file.slice(i * chunkSize, Math.min(file.size, (i + 1) * chunkSize));const formData = createFormData(chunk, i, totalChunks, fileId);try {await axios.post("/upload-chunk", formData);// 更新本地记录uploadedChunks.push(i);saveLocalUploadProgress(fileId, uploadedChunks);} catch (error) {console.error(`分片 ${i} 上传失败:`, error);// 保留已成功上传的分片记录throw error;}}// 4. 所有分片上传完成后合并await axios.post("/merge-chunks", { fileId, fileName: file.name });// 清除本地记录clearLocalUploadProgress(fileId);}

秒传:通过接口传入 hash 值判断是否服务器是否存在文件,存在就复用分片

      async function quickUpload(file) {// 检查服务器是否已有该文件const { exists } = await axios.post("/check-file", {fileName: file.name,fileSize: file.size,fileHash});if (exists) {console.log("文件已存在,秒传成功");return { skipped: true };}// 不存在则正常上传return uploadFile(file, fileHash);}

相关文章:

大文件分片上传

分片:// 获取文件对象const inputFile = document.querySelector(input[type="file"]);// 设置分片大小:5MBconst CHUNK_SIZE = 5 * 1024 * 1024;// 文件上传事件inputFile.onchange = async (e) => {// 获取文件信息const file = e.target.files[0];// 获取文件…...

人小鼠免疫细胞maker基因 - un

人小鼠ref:https://www.abcam.cn/primary-antibodies/immune-cell-markers-poster作者:un-define出处:https://www.cnblogs.com/mmtinfo/p/19099316本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究…...

HyperWorks许可配置

在工程设计和仿真领域,正确的软件许可配置是确保工作流程顺畅、提高生产效率和实现最佳投资回报的关键。HyperWorks作为业界领先的工程仿真软件,其灵活的许可配置功能为用户提供了广泛的定制选项,确保软件能够完全满足各种业务需求。 什么是HyperWorks许可配置? HyperWorks…...

国标GB28181视频平台EasyGBS如何解决安防视频融合与级联管理的核心痛点?

国标GB28181视频平台EasyGBS如何解决安防视频融合与级联管理的核心痛点?在平安城市、雪亮工程等大型安防项目中,如何解决不同品牌设备与平台之间的互联互通难题?本文深度解析基于国标GB/T28181协议的EasyGBS视频平台的核心特点与技术优势,阐述其如何通过标准化协议,实现大…...

python基础-推导式

1.列表推导式 : 有规律的快速创建或者控制列表1.1 创建列表 eg: list1 = [ i for i in range(10)]1.2 带条件判断的列表推导式eg: list1 = [ i for i in range(50) if i % 3 == 0]3.多个for循环实现的列表推导式eg: list1 = [(item1, item2) for item1 in list2 for item2 in…...

人 CD 抗原完全指南 - un

设立分化簇 (CD) 命名系统的目的是对白细胞表面抗原进行分类。 最初,表面抗原是根据与它们结合的对应单克隆抗体进行命名。随着各实验室逐渐发现抗原常能刺激产生多种单克隆抗体,因此需要采用一种统一的命名系统。1982 年于巴黎举行的第 1 届国际人类白细胞分化抗原专题讨论会…...

Java入门知识

Java的特性和优势 简单性 面向对象 可移植性 (“Write once ,run anywhere”) 高性能 分布式 动态性 (反射机制) 多线程 (同时进行) 安全性 (异常机制,防病毒防篡改) 健壮性 在学习过程中爱上它,能够不断主动学习 在机遇来临之前,不断健壮自己 Java的三大版本 “Wri…...

AUTOSAR网络管理

汽车行业的网络管理一般有两种,一种是AutoSar另一种是OSEK,为啥汽车要网络管理,其实是为了降低车辆电池消耗,当车辆不工作时所有总线上的ECU通讯模块或整个ECU处于低功耗状态。网络管理一般用在电池供电的ECU,比如车上CAN上的ECU。为了避免通讯错误,需要网络管理来协调网…...

写用例注意点

写用例注意点: 1、测试标题 明确测试点 2、写用例的前几条用例都是主要场景的用例先写 微信个人能发微信红包 微信群发能发拼手气红包 微信群发能发拼手气红包 微信群发能发专属气红包 3、测试标题尽量写内容不要写案例: 例如验证标题能修改密码为:6666 4、相同的模块可以进…...

12 路低延迟推流!米尔 RK3576 赋能智能安防 360 环视

在智慧城市建设加速与社区安防需求升级的双重驱动下,“360 无死角监控 + 实时响应” 已成为安防领域的核心诉求。传统监控方案常受限于摄像头接入数量不足、编解码效率低、推流延迟高三大痛点,难以覆盖社区、园区等复杂场景的全点位监控,更无法满足应急事件 “毫秒级响应” …...

A公司一面:类加载的过程是怎么样的? 双亲委派的优点和缺点? 产生fullGC的情况有哪些? spring的动态代理有哪些?区别是什么? 如何排查CPU使用率过高?

A公司一面:类加载的过程是怎么样的? 双亲委派的优点和缺点? 产生fullGC的情况有哪些? spring的动态代理有哪些?区别是什么? 如何排查CPU使用率过高?摘要 A公司的面经JVM的类加载的过程是怎么样的? 双亲委派模型的优点和缺点? 产生fullGC的情况有哪些? spring的动态代…...

Alternating Subsequence

CF1343C Alternating Subsequence 题目描述 回忆一下,如果序列 \(b\) 是序列 \(a\) 的一个子序列,那么 \(b\) 可以通过从 \(a\) 中删除零个或多个元素(不改变剩余元素的顺序)得到。例如,如果 \(a=[1, 2, 1, 3, 1, 2, 1]\),那么可能的子序列有:\([1, 1, 1, 1]\),\([3]\)…...

白鲸开源“创客北京2025”再摘殊荣,聚焦Agentic AI时代数据基础设施建设

近日,“创客北京2025”创新创业大赛海淀区级赛圆满落幕,经过最终比拼,北京白鲸开源科技有限公司凭借 「Agentic AI时代下的数据基础设施平台」(白鲸数据集成调度平台/WhaleStudio) 脱颖而出,荣获企业组二等奖。近日,“创客北京2025”创新创业大赛海淀区级赛圆满落幕,经…...

python基础-公共操作

数据类型间公共支持的操作符运算: + ,* ,in , not in‘+’ :支持的容器类型 字符串、列表、元组 ,实现两个容器的合并‘*’ : 支持的容器类型 字符串、列表、元组, 赋值容器内容str1 = q str1* 5 =qqqqqlist1 = [hello] list1*5 = [hello, hello, hello,…...

天翼云第九代弹性云主机:让每一次计算快人一步

随着数字化转型进程不断深入,云计算已成为推动千行百业智能化升级的核心引擎。弹性计算服务凭借其灵活扩展、高可用和高性能等特点,正持续为企业提供关键基础设施支持。面对日益复杂的业务场景与持续增长的计算需求,天翼云始终致力于通过持续创新和技术升级,推动弹性计算服…...

若依(RuoYi)框架漏洞总结

0x01 特征 绿若依 icon_hash=”706913071”蓝若依 icon_hash=” -1231872293”0x02 漏洞 弱口令 用户:admin ruoyi druid 密码:123456 admin druid admin123 admin888若依前台默认shiro key命令执行漏洞 若依默认使用shiro组件,所以可以试试shiro经典的remember…...

第一次个人项目作业_论文查重

第一次项目作业这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13477这个作业的目标 实现一个3000字以上论文查重程序github连接:…...

2025年版《中科院期刊分区表》与2023年版对比表,附名单可直接查阅

2025年版《中科院期刊分区表》与2023年版相比,主要有以下几个变化‌: ‌1、发布时间提前‌:2025年版分区表从12月提前至3月发布,与投稿周期同步,学者可以尽早锁定期刊最新分区,避免“投稿后降区”的风险‌。 ‌2、增加ESCI期刊收录‌:2025年版分区表增加了ESCI期刊的收录…...

对马岛之魂

护身符 稻荷神护身符----增加资源的获取 aa...

2019年双因素认证最佳实践指南

本文深入探讨2019年双因素认证的正确实现方式,对比TOTP与WebAuthn技术优劣,分析用户行为模式,并提供实际部署建议,帮助开发者构建更安全的认证系统。2019年正确实现双因素认证 - Trail of Bits博客 自3月起,Trail of Bits一直与Python软件基金会合作,为Warehouse(PyPI的…...

Account Kit(华为账号服务)再进化,开发者接入效率飙升!

Hi 各位开发者朋友~👋 为持续优化开发体验,提升集成效率,Account Kit接入体验再升级,助力构建更流畅、更安全的登录体验,让开发效率火力全开!😎 【体验升级】华为账号相关权益申请入口统一迁移至AGC华为账号一键登录权益实时审批华为账号一键登录支持三方开发框架01 …...

软件工程个人项目

软件工程个人项目3123004548软件工程个人项目这个作业属于哪个课程 <https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024>这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13477这个作业的目标 <设计一个…...

学习道路道阻且长 希望自己坚持下去

本人是一名专升本的大三学生 现在专业是软件工程专业 从今天开始学习java 翻了一下资料 发现很多人建议从前端开始学习 在专科学习中 也学过相应的基础知识,不过遗忘程度可能有点严重。对于语言的基本语法掌握需要加强巩固,希望自己好好坚持下去,努力学习。...

2025/9/18 总结

A 用时:2h 预期:100pts 实际:100pts 求出前缀和,\(s_k+s_i \text{xor} s_k\),考虑从高到低贪心,如果 \(s_i\) 的 \(j\) 位为 \(1\),不管如何贡献都有 \(2^j\),如果 \(s_i\) 的第 \(j\) 位为 \(0\),则 \(s_k\) 的第 \(j\) 位为 \(1\) 有 \(2_{j+1}\) 贡献,用高维前缀和…...

P2216 [HAOI2007] 理想的正方形

P2216 [HAOI2007] 理想的正方形#include <bits/stdc++.h> using namespace std;const int maxn = 1e3 + 10; int a,b,n; int c[maxn][maxn]; deque <int> dq1,dq2; int max1[maxn][maxn],min1[maxn][maxn]; int max2[maxn][maxn],min2[maxn][maxn];int ans = 2e9;i…...

PuTTY下载和安装

下载地址: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html更改安装路径创建桌面快捷方式...

数据通路-单总线结构(最头晕的一集)

数据通路就是数据在各个部件之间传输的路径(包括路径上的部件) 控制信号是有控制部件产生的 数据通路的结构 1cpu内部单总线方式 2cpu内部多总线方式 3专用数据通路方式 内部总线 是指同一个部件,如cpu内部链接各寄存器以及运算部件之间的总线; 系统总线 是指同一台计算机系…...

python基础篇-集合

集合 :集合内的数据不重复,但是数据是无序的创建集合 {} 或者set()注: 创建空集合只能用set(), 因为{}已经被字典占用了eg: s1 = {10, 20 ,40,30 }eg: s2 = set(abcdefg) :用set创建,序列会被拆开 = 》 {’a, b, c, d, e, f, g}集合的操作:1.增加s1.add() 增加单个数据…...

#egsg:在同一程序中比较-计算圆的面积

以下是一个同时使用easygui和pysimplegui实现的圆形面积计算程序,通过菜单让用户选择使用哪种GUI库: import math import easygui import PySimpleGUI as sgdef easygui_calculator():"""使用easygui实现的版本"""title = "圆形面积计算器…...

282 项多模态胃肠病学数据集:适配 VLM 与 MLLM 微调,融合医学图像与临床文本的医疗 AI 训练数据

​ 获取更多高质量数据集,请访问典枢数据交易平台:https://dianshudata.com一、引言与背景 在医疗人工智能领域,胃肠病学的智能化诊断与分析始终依赖高质量数据的支撑,而视觉语言模型(VLM)与多模态大型语言模型(MLLM)的崛起,为整合医学图像与文本信息、提升临床决策效…...

2-sat板子

vector<int>e[maxn]; int n,m; int inscc[maxn]; int low[maxn],dfn[maxn]; stack<int>stk; int instk[maxn]; int tot,cnt; vector<int>scc[maxn];void dfs(int u,int fa){low[u]=dfn[u]=++tot;stk.push(u);instk[u]=1;for(int v:e[u]){if(!dfn[v]){//树边d…...

centos 7中安装jenkins

1.安装java11 [root@localhost ~]# yum install -y java-11-openjdk-devel [root@localhost ~]# java --version openjdk 11.0.23 2024-04-16 LTS OpenJDK Runtime Environment (Red_Hat-11.0.23.0.9-2.el7_9) (build 11.0.23+9-LTS) OpenJDK 64-Bit Server VM (Red_Hat-11.0.2…...

pythonjs逆向 破解滑动验证码 - hello-*

现在的滑动验证码防盗等级都比较高,之前的是一张完整的图片带缺口,现在返回的图片是打乱顺序拼接而成的,所以现在破解不仅要识别滑块的缺口,同时还需要复原完整的图片一.伪造请求获取验证码图片可以看到请求中主要的两个参数ctxid和request,所以我们只需要找到这两个参数的…...

解决 pandas.to_csv 乱码、丢失行和自动换行问题 时间转换

解决 pandas.to_csv 乱码、丢失行和自动换行问题-百度开发者中心 https://developer.baidu.com/article/details/2792989 在使用 pandas.to_csv 函数时,可能会遇到一些问题,如乱码、丢失行和自动换行等。这些问题通常是由于编码格式、数据类型或文件写入方式不当引起的。下面…...

JavaDay7

数组 数组的定义数组是相同类型数据的有序集合。 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。数组声明创建首先必须声明数组变量,才能在程序中使用数组。下面是声明数组…...

前端场景题笔记

先说背景再说方案 1. js超过number最大值的数怎么处理? 换数据类型。 2. 如何解决页面请求接口大规模并发问题? 请求队列,Push,shift。防抖节流。 3. 大文件上传? 前端切片,标记唯一值,后端整合。 4. 前端怎么实现截图? Canvas(基于html的绘图工具)(…...

P3934 [Ynoi Easy Round 2016] 炸脖龙 I 做题记录

欧拉函数前置芝士:扩展欧拉定理 题目大意 给一个长为 \(n\) 的序列,\(m\) 次操作,每次操作:区间 \([l,r]\) 加 \(x\); 对于区间 \([l,r]\),查询:\[{a_l}^{{a_{l+1}}^{{a_{l+2}}^{{\dots} ^{a{r}}}}} \mod p \]思路 首先我们有: \[a^k\equiv \left\{\begin{matrix}a^k, …...

【CompletableFuture 核心操作全解】详细注释版

一、任务创建操作 1. runAsync() - 执行无返回值的异步任务 /*** 创建并执行无返回值的异步任务* * @param runnable 要执行的任务逻辑(无返回值)* @return CompletableFuture<Void> 表示任务执行状态的Future对象* * 特点:* - 任务在ForkJoinPool.commonPool()中执行…...

关于学术不端的一些思考

前言 由图书馆性骚扰事件,牵扯出学术不端行为,最后撤销硕士学位。正应了那句“来说是非者,便是是非人”。学术不端 中华人民共和国学术不端问题包括论文抄袭、洗稿、代写、造假、买卖、学历学位认证失信行为、掠夺性开放获取出版、批量引进海外“速成博士”等。 国际上一般指…...

python基础-字典

字典:以键值对的方式存储 { key: value, key2:value2} 初始化空字典: dict2 = {} 或者dict3 = dict() 字典的常见操作:1.增加 dict1[id] = 1101 如果key = id不存在,则新增key和value对应的键值对; 如果key = id的已存在,则修改覆盖key = id对应的value的值2.删除del …...

pod 内nslookup请求时常异常

pod 内nslookup请求时常异常 现象原因 装机模板中在 /etc/resolv.conf 添加了 search tbsite.net 。 kubelet clusterfist 会自动将宿主机的 search 追加到 search default.svc.cluster.local svc.cluster.local 之后。 解决方式 清理 node 上的 search 记录。业务 pod 需要重启…...

单调队列优化DP

董晓一系列都可以做下来 https://www.bilibili.com/video/BV19X4y1m7Sb dp题单 https://www.luogu.com.cn/training/853282...

4.5.11版本闪亮登场~快来看看有哪些新功能

产品更新概览 功能修复: 修复检测更新失败问题; 修复iframe组件存放文件夹无法打开问题; 修复二维地图部分场景加载失败问题; 修复项目发布后无法获取数据问题; 修复访客免验证登录校验问题。 功能优化: 优化数据刷新逻辑; 鲸孪生标记性能优化; 图标组件性能优化; 优化…...

教你数分钟内创建并运行一个 DolphinScheduler Workflow!

本文就主要探讨如何在 ApacheDolphinScheduler 上更好地玩转 Workflow, 以帮助大家更好地管理数据处理任务。Workflow是什么? 对于数仓场景和数据湖场景来说,最显著的特点就是数据处理的长流程和高复杂度任务依赖关系,从源数据采集到最终报表数据的生成,中间可能经历上百个…...

AT_agc065_b [AGC065B] Erase and Insert

倒过来看,每次将 \(p\) 中 \(i\) 随便放到一个位置,那么在放 \(i\) 之前,你需要保证 \(1 \sim i - 1\) 的相对顺序递增,然后就可以 DP 了。 另外一种做法是题解区第一篇。...

《大模型时代——智能体的崛起与应用实践(微课视频版)》

在人类技术演进的长河中,人工智能(Artificial Intelligence,AI)无疑是最具革命性的篇章之一。随着科技的飞速发展,人类迎来了一个全新的纪元—大模型时代。本章旨在深入剖析这一时代的内涵,从大模型的基本概念出发,探索其发展历程,关键技术要素,核心价值,以及支撑其发…...

第三节:GoLangChain提示词(Prompts)处理详解

在使用大语言模型(LLM)时,提示词(Prompt)是与模型交互的关键。良好的提示词设计能够显著提升模型输出的质量。本文将基于langchaingo库,详细介绍Go语言中处理提示词的几种主要方式。 1. 引言在与大语言模型交互时,提示词的设计至关重要。LangChain框架提供了一套完整的提示词…...

rhel8 中vdo 邏輯卷的邏輯擴容

物理盤 = 500G vdo size = 2000G 擴容到5000Gumount /home/repo vdo stop --name=vdo01 vdo growLogical --name=vdo01 --vdoLogicalSize=5000Gdf --human-readable /home/repoxfs_growfs /dev/mapper/vdodf --human-readable /home/repovdostats --human...

Codeforces Round 1051 (Div. 2) 部分题解

D E F 题解Codeforces Round 1051 (Div. 2) 部分题解 D - Inversion Graph Coloring 理解成二分图,图中没有奇环,等价于序列不存在 \(i<j<k\) 使得 \(a_i>a_j>a_k\) 。 设 \(f_{i,x,y}\) 表示前 \(i\) 个数,当前序列最大值为 \(x\) ,下一个不能取小于 \(y\) 的…...

kingbase金仓数据库的密码有效期和密码复杂度

Kingbase金仓数据库提供了密码有效期和复杂度配置功能,可以通过以下方式进行设置: 一. 密码有效期配置 插件identity_pwdexp identity_pwdexp是KingbaseES的一个扩展插件,用于设置口令有效期。 KingbaseES的用户管理中含有口令有效期这一属性,用户密码过期检查就是通过设置…...