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

【前端】【业务场景】【面试】在前端开发中,如何实现文件的上传与下载功能,并且处理可能出现的错误情况?

前端文件上传与下载攻略

本文目标:帮你快速掌握文件上传 & 下载的核心实现方式,并在常见出错场景下保持“优雅不崩溃”。


一、文件上传

1. 基础结构

<input type="file" id="fileInput" />
<button id="uploadBtn">上传</button>

2. 核心脚本

document.getElementById('uploadBtn').addEventListener('click', uploadFile);async function uploadFile () {const file = fileInput.files?.[0];           // ① 是否选择文件if (!file) return alert('请先选择文件!');const formData = new FormData();formData.append('file', file);try {const res = await fetch('/upload', {       // ② 发请求method: 'POST',body: formData,});if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();             // ③ 处理业务结果alert(`上传成功:${data.filename}`);} catch (err) {console.error(err);alert(`上传失败:${err.message}`);          // ④ 兜底提示}
}
⏳ 重点错误防护
  1. 未选文件if (!file) …
  2. 网络/HTTP 错误!res.ok 判定 & 抛错。
  3. 接口业务错误:后端自定义 code → 前端根据 data.code 决策 UI。
  4. 超大文件 / 类型不符:后端校验 → 返回 413/415,前端同样走 !res.ok 分支。

二、文件下载

场景 1:文件已存在静态 URL

<a href="/static/report.pdf" download="报告.pdf">下载报告</a>

场景 2:前端生成 / 动态获取文件

async function downloadDynamic () {try {// ① 拿到二进制(示例:后台生成 excel)const res = await fetch('/export/excel');if (!res.ok) throw new Error(`HTTP ${res.status}`);const blob = await res.blob();             // ② 转 blobconst url  = URL.createObjectURL(blob);    // ③ 临时链接// ④ 触发下载const a    = document.createElement('a');a.href     = url;a.download = 'data.xlsx';a.click();URL.revokeObjectURL(url);                  // ⑤ 释放内存} catch (err) {alert(`下载失败:${err.message}`);}
}
⚠️ 常见下载错误处理
错误场景浏览器表现前端防范思路
链接 404 / 403浏览器提示/空白页!res.ok 捕获 + 友好提示
权限不足返回 401/403跳登录页或提示“无权限下载”
内容空 / 后端异常文件 0 Bblob.size === 0 时提示并中断

三、实战加分 Tips

  1. 进度条
    const xhr = new XMLHttpRequest();
    xhr.upload.onprogress = e => {if (e.lengthComputable) {const percent = (e.loaded / e.total) * 100;console.log(`已上传 ${percent.toFixed(1)}%`);}
    };
    
  2. 多文件并发上传Array.from(fileInput.files).map(f => formData.append('files', f))
  3. 拖拽上传:监听 dragover / drop,获取 event.dataTransfer.files
  4. 断点续传:结合 Content-Range + 后端分片合并。
  5. 安全防护
    • 前端白名单校验 MIME / 后缀。
    • token/签名防盗链。
    • HTTPS 保障传输安全。

四、结语

实现文件上传与下载并不难,难的是在各种异常面前稳如老狗

  • 上传要三查:文件、网络、后端业务。
  • 下载要三稳:合法链接、正确权限、完整内容。

相关文章:

【前端】【业务场景】【面试】在前端开发中,如何实现文件的上传与下载功能,并且处理可能出现的错误情况?

前端文件上传与下载攻略 本文目标&#xff1a;帮你快速掌握文件上传 & 下载的核心实现方式&#xff0c;并在常见出错场景下保持“优雅不崩溃”。 一、文件上传 1. 基础结构 <input type"file" id"fileInput" /> <button id"uploadBtn&…...

【axios取消请求】如何在token过期后取消未响应的请求

功能背景&#xff1a; 我们在实际项目中通常会遇到登录过期后会跳登录页的情况&#xff0c;回跳过程会根据接口请求的状态码判断是否登陆状态过期&#xff0c;并给出用户提示&#xff0c;如果此时存在多个请求接口同时调用&#xff0c;就会同时报出多个登录过期的提示&#xf…...

【高频考点精讲】JavaScript中的组合模式:从树形结构到组件嵌套实战

📚 目录 📦 什么是组合模式?🌲 基础版:用组合模式构建一个简单的树形结构💡 举个更真实的场景:菜单组件🧠 为什么组合模式在前端特别重要?🔨 实战案例:组件嵌套组合 + 权限控制🧩 组合模式的延伸用法:搭建 UI DSL 引擎🧪 面试题时间(欢迎评论区作答)组…...

《仙剑奇侠传二》游戏秘籍

无限冥纸&#xff1a;在丰都城&#xff0c;点击特定的小猫&#xff0c;它会给你五张冥纸&#xff0c;再次点击还会再给五张&#xff0c;可循环获取。无限使用虎煞技能&#xff1a;学会 “虎啸风声” 技能后&#xff0c;将虎煞之力值设置为 16&#xff0c;在战斗中持续使用该技能…...

AWS 中国区 CloudFront SSL 证书到期更换实战指南

适用场景: AWS 中国区(宁夏区域 cn-northwest-1 或北京区域 cn-north-1)CloudFront 分配的 SSL 证书到期后无缝替换,域名主体为 domain.cn。 背景与痛点 当 CloudFront 使用的 SSL 证书即将到期时,需手动替换新证书以避免服务中断。由于 AWS 中国区 不支持 ACM 证书,必须…...

【2025A卷】华为OD机试九日集训第3期 - 按算法分类,由易到难,提升编程能力和解题技巧,从而提高机试通过率(Python/JS/C/C++)

目录 一、适合人群二、本期训练时间三、如何参加四、数据结构与算法大纲五、华为OD九日集训第3期第1天、逻辑分析第2天、逻辑分析第3天、双指针第4天、双指针第5天、数据结构map第6天、栈第7天、二叉树第8天、贪心算法第9天、二分查找 六、集训总结国内直接使用最新o3、o4-mini…...

MacOS上如何运行内网穿透详细教程

本文以市面常见、好用的内网穿透为例&#xff0c;一款为开源内网穿透工具Frp;另一款为国产新锐软件ZeroNews。 一、Frp&#xff08;开源工作、使用自由&#xff09; 1. 下载 FRP 访问 FRP 的 GitHub 发布页&#xff1a; https://github.com/fatedier/frp/releases 选择适合 …...

第55讲:农业人工智能的跨学科融合与社会影响——构建更加可持续、包容的农业社会

目录 一、农业人工智能的多维融合:科技与社会的桥梁 1. 技术与社会:解决现代农业中的不平等 2. AI与伦理:塑造道德规范与社会责任 3. AI与政策:推动农业政策的科学决策与智能执行 二、AI与农业未来社会的构建:更绿色、更智能、更包容 1. 推动农业可持续发展:绿色农…...

JVM性能优化之老年代参数设置

一、引言 咱们书接上回&#xff0c;上篇文章主要讲解了年轻代参数设置&#xff0c;如果对这一部分还不清楚的建议先去看一下&#xff08;年轻代参数设置&#xff09;&#xff0c;本文主要为大家介绍老年代参数的设置&#xff0c;掌握好jvm参数的设置是一个高级开发人人员必备的…...

在 Ubuntu 环境为 Elasticsearch 引入 `icu_tokenizer

1. 为什么需要 ICU 分析插件 Elasticsearch 默认的 standard tokenizer 遵循 UAX #29 规则&#xff0c;但在 CJK&#xff08;中、日、韩&#xff09;等亚洲语言上仅能按字符切分&#xff0c;无法识别词边界&#xff1b;对包含重音符号、大小写或多脚本混排的文本也缺乏统一归一…...

JMeter 安装及使用 [软件测试工具]

目录 JMeter 1. JMeter 安装 1.1 点击官网下载: JMeter官网下载 1.2 下载后解压即可 1.3 打开 JMeter 1.3.1 方式一: 点击对应程序打开 1.3.2 方式二: 命令行启动 1.4 关闭 JMeter 2. JMeter 基础配置 2.1 修改字体为简体中文 2.2 添加拓展插件 2.2.1 下载其他监听器…...

Unity 资源合理性检测

一&#xff1a;表格过度配置&#xff0c;表格资源是否在工程中存在&#xff0c;并输出不存在的资源 import pandas as pd import glob import osassets [] count 0# 遍历configs文件夹下所有xlsx文件 for file_path in glob.glob(configs/*.xlsx):count 1try:sheets pd.re…...

vue-study(1)

黑马智数项目 黑马智数是一个数字化园区管理项目&#xff0c;该项目后台可以在线管理园区内的楼宇、企业、车辆和一体杆等资源&#xff0c;可视化大屏通过园区3D模型实时展示园区概况。通过该项目能学到如何用qiankun搭建微前端架构、用Echarts进行数据可视化、以及前沿的3D模…...

XS5032:高性能3DNR+HDR ISP-TX 2K芯片

爱芯元智 XS5032&#xff1a;高性能3DNRHDR ISP-TX 2K芯片 视频输入 支持MIPI接口&#xff0c;4lane&#xff0c;Max.1.5Gbps/lane 支持Sensor并口&#xff08;DVP&#xff09; 视频分辨率 支持多种同轴高清制式和标清制式&#xff0c;包括&#xff1a; 960H25/30fps&…...

[原创](现代Delphi 12指南):[macOS 64bit App开发]:如何使用NSString类型字符串?

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...

TDengine 流计算引擎设计

流计算架构 TDengine 流计算的架构如下图所示。当用户输入用于创建流的 SQL 后&#xff0c;首先&#xff0c;该 SQL 将在客户端进行解析&#xff0c;并生成流计算执行所需的逻辑执行计划及其相关属性信息。其次&#xff0c;客户端将这些信息发送至 mnode。mnode 利用来自数据源…...

扩展中国剩余定理

中国剩余定理 中国剩余定理 考虑一组模线性同余方程&#xff1a; { x ≡ a 1 ( m o d m 1 ) x ≡ a 2 ( m o d m 2 ) . . . x ≡ a k ( m o d m k ) \begin{cases} x\equiv a_1\pmod{m1} \\ x\equiv a_2\pmod{m2}\\ .\\ .\\ .\\ x\equiv a_k\pmod{mk}\\ \end{cases} ⎩ ⎨ ⎧…...

git检查提交分支和package.json的version版本是否一致

这里写自定义目录标题 一、核心实现步骤‌1.安装必要依赖‌2.初始化 Husky‌3.创建校验脚本‌4.配置 lint-staged‌5.更新 Husky 钩子‌ 三、工作流程说明‌四、注意事项‌ 以下是基于 Git Hooks 的完整解决方案&#xff0c;通过 husky 和自定义脚本实现分支名与版本号一致性校…...

Git 详细使用说明文档(适合小白)

Git 详细使用说明文档&#xff08;适合小白&#xff09; 1. 什么是 Git&#xff1f; Git 是一个版本控制系统&#xff0c;帮助你管理和跟踪代码的变更。无论是个人项目还是团队协作&#xff0c;Git 都能帮助你记录代码的历史版本&#xff0c;方便回溯和协作。 2. 安装 Git …...

【嵌入式系统设计师(软考中级)】第二章:嵌入式系统硬件基础知识(2)

文章目录 3.嵌入式系统的存储体系3.1 存储系统的层次结构3.2 内存管理单元&#xff08;MMU&#xff09;3.3 RAM和ROM的种类3.3.1 RAM类型对比3.3.2 ROM类型对比 3.4 高速缓存&#xff08;Cache&#xff09;3.5 其他存储设备3.5.1 新型存储技术3.5.2 外存接口技术 3.嵌入式系统的…...

rk3588 驱动开发(三)第五章 新字符设备驱动实验

register_chrdev 和 unregister_chrdev 这两个函数是老版本驱动使用的函数&#xff0c;现在新的字符设备驱动已经不再使用这两个函数&#xff0c;而是使用 Linux 内核推荐的新字符设备驱动 API 函数。本节我们就来学习一下如何编写新字符设备驱动&#xff0c;并且在驱动模块加载…...

文件上传--WAF绕过干货

本文主要内容 绕过WAF上传文件 -- 安全狗 -- 宝塔 Burp抓包解析 #上传参数名解析&#xff1a;明确哪些东西能修改? Content-Disposition&#xff1a;—般可更改 name&#xff1a;表单参数值&#xff0c;不能更改 filename&#xff1a;文件名&#xff…...

BERT BERT

BERT ***** 2020年3月11日更新&#xff1a;更小的BERT模型 ***** 这是在《深阅读的学生学得更好&#xff1a;预训练紧凑模型的重要性》&#xff08;arXiv:1908.08962&#xff09;中提到的24种较小规模的英文未分词BERT模型的发布。 我们已经证明&#xff0c;标准的BERT架构和…...

Kotlin Multiplatform--02:项目结构进阶

Kotlin Multiplatform--02&#xff1a;项目结构进阶 引言正文 引言 在上一章中&#xff0c;我们对 Kotlin Multiplatform 项目有了基本的了解&#xff0c;已经可以进行开发了。但我们只是使用了系统默认的项目结构。本章介绍了如何进行更复杂的项目结构管理。 正文 在上一章中&…...

【ES实战】Elasticsearch中模糊匹配类的查询

Elasticsearch中模糊匹配类的查询 文章目录 Elasticsearch中模糊匹配类的查询通配符查询前缀匹配查询正则匹配查询标准的正则操作特殊运算符操作 模糊化查询Fuzziness text类型同时配置keyword类型 Elasticsearch中模糊类查询主要有以下 Wildcard Query&#xff1a;通配符查询P…...

纯真社区IP库离线版发布更新

纯真社区IP库离线版发布更新 发布者&#xff1a;技术分享 2005年&#xff0c;随着中国互联网的蓬勃发展&#xff0c;纯真IP库诞生了。作为全球网络空间地理测绘技术的领先者&#xff0c;纯真开源项目为中国互联网行业提供了高质量的网络空间IP库数据。纯真IP库目前已经覆盖超…...

直接偏好优化(Direct Preference Optimization,DPO):论文与源码解析

简介 虽然大规模无监督语言模型&#xff08;LMs&#xff09;学习了广泛的世界知识和一些推理技能&#xff0c;但由于它们是基于完全无监督训练&#xff0c;仍很难控制其行为。 微调无监督LM使其对齐偏好&#xff0c;尽管大规模无监督的语言模型&#xff08;LMs&#xff09;能…...

uniapp-商城-34-shop 购物车 选好了 进行订单确认

在shop页面选中商品添加到购物车&#xff0c;可选好后&#xff0c;进行确认和支付。具体呈现在shop页面。 1 购物车栏 shop页面代码&#xff1a; 购物车代码&#xff1a; 代码&#xff1a; <template><view><view class"carlayout"><!-- 车里…...

Kafka命令行的使用/Spark-Streaming核心编程(二)

Kafka命令行的使用 创建topic kafka-topics.sh --create --zookeeper node01:2181,node02:2181,node03:2181 --topic test1 --partitions 3 --replication-factor 3 分区数量&#xff0c;副本数量&#xff0c;都是必须的。 数据的形式&#xff1a; 主题名称-分区编号。 在…...

虚拟机详解

虚拟机详解 1. 虚拟机&#xff08;Virtual Machine&#xff09;的定义 系统虚拟机&#xff1a;通过软件模拟完整计算机系统&#xff08;CPU、内存、外设等&#xff09;&#xff0c;如 VMware、VirtualBox。进程级虚拟机&#xff1a;为单个应用提供虚拟执行环境&#xff0c;如 …...

NOIP2013 提高组.转圈游戏

目录 题目算法标签: 数论, 模运算思路代码 题目 504. 转圈游戏 算法标签: 数论, 模运算 思路 看题意不难看出, 计算的是 ( x 1 0 k m ) m o d n (x 10 ^ k \times m) \mod n (x10km)modn, 如果直接计算一定会超时, 因此可以使用快速幂进行优化 代码 #include <iost…...

【金仓数据库征文】加速数字化转型:金仓数据库在金融与能源领域强势崛起

目录 一、引言 二、金仓数据库&#xff08;KingbaseES&#xff09;概述 1. 发展历程与市场地位 2. 核心技术架构 3. 金仓数据库的特点 三、金仓数据库在金融行业的应用 1. 金融行业的挑战与需求 2. 金仓数据库在金融行业的优势 3. 金仓数据库在金融行业的实际应用案例 …...

济南国网数字化培训班学习笔记-第二组-5节-输电线路设计

输电线路设计 工程设计阶段划分 35kv及以上输变电工程勘测设计全过程 可行性研究&#xff08;包括规划、工程选站&#xff09;&#xff08;包括电力系统一次二次&#xff0c;站址选择及工程设想&#xff0c;线路工程选择及工程设想&#xff0c;节能降耗分析&#xff0c;环境…...

【前端】【业务场景】【面试】在前端开发中,如何实现一个可拖动和可缩放的元素,并且处理好边界限制和性能优化?

问题&#xff1a;在前端开发中&#xff0c;如何实现一个可拖动和可缩放的元素&#xff0c;并且处理好边界限制和性能优化&#xff1f; 一、实现可拖动和可缩放元素 HTML 和 CSS 基础设置&#xff1a; 创建一个 HTML 元素&#xff0c;并为其设置基本样式&#xff0c;使其在页面…...

BOM与DOM(解疑document window关系)

BOM&#xff08;浏览器对象模型&#xff09; 定义与作用 BOM&#xff08;Browser Object Model&#xff09;提供与浏览器窗口交互的接口&#xff0c;用于控制导航、窗口尺寸、历史记录等浏览器行为 window&#xff1a;浏览器窗口的顶层对象&#xff0c;包含全局属性和方法&am…...

504 nginx解决方案

当遇到 504 Gateway Time-out 错误时&#xff0c;通常是因为 Nginx 作为反向代理等待后端服务&#xff08;如 PHP-FPM、Java 应用等&#xff09;响应的时间超过了预设的超时阈值。以下是详细的解决方案&#xff0c;结合知识库中的信息整理而成&#xff1a; 一、核心原因分析 后…...

【LLM+Code】Windsurf Agent 模式PromptTools详细解读

一、前言 https://windsurf.com/ https://windsurf.com/blog/why-we-built-windsurf https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools/tree/main/Windsurf 二、System Prompt 相比于cursor和claude code&#xff0c; windsurf的system prompt非常长&am…...

第三章:Transport Mechanisms

Chapter 3: Transport Mechanisms &#x1f31f; 从上一章到本章 在第二章&#xff1a;MCP服务器分类中&#xff0c;我们学会了如何根据需求选择不同类别的服务器&#xff08;如文件系统、数据库等&#xff09;。现在想象这样一个场景&#xff1a;你有一个本地文件服务器和一个…...

shell练习题(1)

练习: 1.建立脚本service.sh,当执行的时候要求输入(1、2、3、4、5)时安装对应的httpd、vim、wget、更换aliyum等功能&#xff0c;当输入错误 时会提示你&#xff0c;应该输入正确的值 [rootbogon yy]# cat service.sh #!/bin/bash cat <<-EOF ----------------------…...

【解决】Android Gradle Sync 报错 Could not read workspace metadata

异常信息 Caused by: java.io.UncheckedIOException:Could not read workspace metadata from C:\Users\xxx\.gradle\caches\transforms-4\69955912123c68eecd096b71c66ee211\metadata.bin 异常原因 看字面意思是不能读取metadata文件&#xff0c;原因可能是因为缓存目录异常…...

Python中的 for 与 迭代器

文章目录 一、for 循环的底层机制示例&#xff1a;手动模拟 for 循环 二、可迭代对象 vs 迭代器关键区别&#xff1a; 三、for 循环的典型应用场景1. 遍历序列类型2. 遍历字典3. 结合 range() 生成数字序列4. 遍历文件内容 四、迭代器的自定义实现示例&#xff1a;生成斐波那契…...

上篇:深入剖析 BLE 底层物理层与链路层(约5000字)

引言 在无线通信领域,Bluetooth Low Energy(BLE)以其超低功耗、灵活的连接模式和良好的生态支持,成为 IoT 与可穿戴设备的首选技术。要想在实际项目中优化性能、控制功耗、保证可靠通信,必须对 BLE 协议栈的底层细节有深入了解。本篇将重点围绕物理层(PHY)与链路层(Li…...

ArcGIS Pro跨图层复制粘贴

在map视图中&#xff0c;点击selection中的Select按钮&#xff0c;保持选择状态。 点击需要复制的要素&#xff0c;保持选中状态。右击点击copy&#xff0c;或CtrlC进行复制。 在Clipboard下拉框中点击Paste Special&#xff0c;选择需要粘贴的图层后点击OK。...

今日CSS学习浮动->定位

------------------------------------------------------------------------------------------------------- CSS的浮动 float 属性用于创建浮动框&#xff0c;将其移动到一边&#xff0c;直到左边缘或右边缘触及包含块或另一个浮动框的边缘。 float 属性定义元素在哪个方向浮…...

性行为同意协议系统网站源码

性行为同意协议系统网站源码 一个用于创建、签署和管理性行为同意协议的 Web 应用程序。该应用允许用户在线创建详细的性行为同意协议&#xff0c;并通过数字签名方式进行签署&#xff0c;同时支持导出为 PDF 格式保存。 功能特性 创建自定义性同意协议 多步骤表单引导用户完…...

项目自动化测试

一.设计测试用例(细致全面) 二.先引入所需要的pom.xml依赖 1.selenium依赖 2.webdrivermanager依赖 3.commons-io依赖 编写测试用例–按照页面对用例进行划分,每个页面是Java文件,页面下的所有用例统一管理 三.common包(放入公用包) 类1utils 可以调用driver对象,访问url …...

可变形卷积(可以观察到变形图片的卷积)【DCNv1、DCNv2、DCNv3】

一、DCNv1——可以观察到扭曲的图片 1.传统卷积的问题 在普通的卷积操作中&#xff0c;比如 33 卷积&#xff0c;采样的位置总是固定的&#xff1a;就是中间一个点&#xff0c;四周八个点&#xff0c;整齐地排成一个小网格。 但现实中的图像并不整齐——比如猫的身体弯着、车…...

vue3,element ui框架中为el-table表格实现自动滚动,并实现表头汇总数据

基础用法不太明白的请参考官网文档 &#xff1b;element ui Plus官网&#xff1a;Table 表格 | Element PlusA Vue 3 based component library for designers and developershttps://element-plus.org/zh-CN/component/table.html 1、添加一个基础表格 <template><e…...

Selenium 怎么加入代理IP,以及怎么检测爬虫运行的时候,是否用了代理IP?

使用selenium爬虫的时候&#xff0c;如果不加入代理IP&#xff0c;很容易会被网站识别&#xff0c;容易封号&#xff1b; 最近去了解了一下买代理ip&#xff0c;但是还是有一些不太懂的东西。 例如有了代理ip以后&#xff0c;怎么用在爬虫上&#xff0c;requests 和selenium的…...

【Python爬虫实战篇】--Selenium爬取Mysteel数据

任务&#xff1a;爬取我的钢铁网的钢材价格指数数据&#xff0c;需要输入时间和钢材类型 网站&#xff1a;钢铁价格指数_今日钢铁价格指数实时行情走势_我的钢铁指数 目录 1.环境搭建 2.打开网站 3.点击右侧按钮展开 4.点击需要的钢材数据 5.点击“按日查询” 6.输入日查…...