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

前端文件上传组件流程的封装

1. 前端文件上传流程

  1. 选择文件

    • 用户点击上传按钮,选择要上传的文件。
    • 使用 <input type="file">FileReader API 读取文件。
  2. 文件校验

    • 校验文件的大小、格式等信息,提前过滤掉不符合要求的文件,避免浪费资源。
  3. 发送请求

    • 创建一个 FormData 对象,将文件内容以及其他相关参数(如文件名、类型等)追加到该对象中。
    • 通过 fetchaxios 发送 HTTP POST 请求,将文件数据传输到服务器。
  4. 处理响应

    • 根据服务器响应处理上传结果,比如展示成功、失败信息或进行错误重试。
    • 如果是分片上传,需追踪每一片的状态和位置。
  5. 显示上传进度(可选):

    • 使用 xhr.upload.onprogressaxiosonUploadProgress 事件实时更新上传进度条。

2. 封装文件上传组件

一个简单的上传组件封装可以包括以下内容:

import React, { useState } from 'react';
import axios from 'axios';const UploadComponent = ({ uploadUrl }) => {const [progress, setProgress] = useState(0);const [status, setStatus] = useState('');const handleFileChange = async (event) => {const file = event.target.files[0];if (!file) return;// 文件大小限制(如10MB)if (file.size > 10 * 1024 * 1024) {alert('文件太大');return;}// FormData 用于文件上传const formData = new FormData();formData.append('file', file);try {setStatus('Uploading...');const response = await axios.post(uploadUrl, formData, {headers: { 'Content-Type': 'multipart/form-data' },onUploadProgress: (progressEvent) => {const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total);setProgress(percent);},});setStatus('Upload successful');console.log('Server response:', response.data);} catch (error) {setStatus('Upload failed');console.error('Upload error:', error);}};return (<div><input type="file" onChange={handleFileChange} /><p>Progress: {progress}%</p><p>Status: {status}</p></div>);
};export default UploadComponent;

3. 关键部分的说明

  • 文件大小限制:封装文件上传组件时,确保在组件内部处理文件大小、类型等校验。
  • 进度展示onUploadProgress 回调可以实时显示上传进度。
  • 错误处理:增加 try-catch 处理上传过程中的错误,保证上传失败时能给用户提示。

4. 后端支持

后端应有对应的文件接收接口,处理 multipart/form-data 格式的请求,存储文件并返回响应

http://www.lryc.cn/news/472704.html

相关文章:

  • 图像篡改研究
  • wlan的8种组网方式的区别
  • 取消element-ui中账号和密码登录功能浏览器默认的填充色,element-ui登录账号密码输入框禁用浏览器默认填充色问题
  • Postman:高效的API测试工具
  • 设计模式-观察者模式(代码实现、源码级别应用、使用场景)
  • 9种 Vuejs 常用事件修饰符与使用指南
  • 第十四题刮开有奖
  • vue3+vite使用dataV后项目运行报错、页面空白问题
  • PDF 【人工智能白皮书 】【大模型安全实践白皮书】【大模型白皮书】【大模型/深度学习/人工智能原理/心智学习】
  • 【vue】13.深入理解递归组件
  • 【OFDM】OFDM Radar Algorithms in Mobile Communication Networks
  • 如何检测java中的内存泄露及溢出,并预防?
  • kafka 如何减少数据丢失?
  • CTF-PWN: 虚表(vtable)
  • Redis 集群 总结
  • 2024校园交友系统构建指南/保姆版教程与技巧uniapp+php支持二开
  • NVR设备ONVIF接入平台EasyCVR视频分析设备平台视频质量诊断技术与能力
  • 系统思考—啤酒游戏经营决策沙盘
  • 组件封装思路
  • akshare股票涨跌停获取统计分析
  • 前端对一个增删改查的思考
  • 【Clickhouse】客户端连接工具配置
  • 【测试平台】打包 jenkins配置和jenkinsfile文件
  • Leetcode224 -- 基本计算器及其拓展
  • python的lambda实用技巧
  • VB中的资源文件(Resource File)及其用途
  • 【vue】11.Vue 3生命周期钩子在实践中的具体应用
  • 1.5 新特性 C++面试常见问题
  • [mysql]子查询的概述和分类及单行子查询
  • SpringMVC执行流程(视图阶段JSP、前后端分离阶段)、面试题