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

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 格式的请求,存储文件并返回响应

相关推荐
IT_陈寒1 天前
Vite打包时遇到的坑,原来问题出在这里
前端·人工智能·后端
kyriewen1 天前
AI生成代码快如闪电,但我修了三个小时——它到底帮了谁?
前端·javascript·ai编程
ayqy贾杰1 天前
基层管理的三板斧,在AI时代行不通了
前端·后端·团队管理
Apifox1 天前
Apifox 5 月更新|Postman 导入优化、Runner 支持非 root 运行、请求代码自动带鉴权
前端·后端·安全
miaowmiaow1 天前
PSD2Code 近期更新与深度解析:从设计稿到生产级代码的完整技术栈
前端·人工智能·ai编程
Hilaku1 天前
多标签页并发请求导致 Token 刷新失败?只有 15行代码就能解决 !
前端·javascript·程序员
Nile1 天前
解密Palantir系列一:4. Ontology 不是哲学
开发语言·前端·javascript
因_崔斯汀1 天前
ECharts 区域地图可视化实战:以山东地图为例
前端
Bacon1 天前
手摸手带你搞清楚 AI Agent 的六大核心概念
前端·人工智能
王林不想说话1 天前
TypeScript 进阶知识总结:从 extends、泛型到 infer,一篇打通 TS 类型系统
前端·javascript·typescript