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

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

相关推荐
kyriewen3 小时前
Anthropic 估值逼近万亿美元,Claude Sonnet 5 + Claude Science 一天两连发
前端·ai编程·claude
小徐_23335 小时前
Wot UI 2.2.0 发布:Button 新增 subtle,VideoPreview 预览体验继续增强
前端·微信小程序·uni-app
天蓝色的鱼鱼7 小时前
关于 CSS 你可能不知道的属性,但关键时刻很有用
前端·css
泯泷8 小时前
第 2 篇:设计第一套字节码:Opcode、Instruction 与 Constant Pool
前端·javascript·安全
妙码生花8 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十五):优化细节、网络请求封装
前端·后端·ai编程
泯泷8 小时前
第 1 篇:从 1 + 2 开始:亲手写出第一台 JSVM
前端·javascript·安全
团团崽_七分甜8 小时前
Spring Boot 核心知识点总结
前端
lichenyang4538 小时前
从一个按钮开始,理解 ASCF 框架到底在做什么
前端
古夕8 小时前
第三方 SSO 接入实践:redirect_uri 编码、回调一致性与跨项目联调
前端·vue.js