react 关于各类文件上传到AWS3的方法封装

 上传文件展示图  

AWS相关的方法和获取信息的封装

import ServerConfig from '@/utils/request';
import S3 from 'react-aws-s3';
// import { getMessage } from '../chat/chat';
import { message } from 'antd';
const config = {
  bucketName: ServerConfig.uploadBucketName,
  region: ServerConfig.uploadRegion,
  accessKeyId: ServerConfig.uploadAccessKeyId,
  secretAccessKey: ServerConfig.uploadSecretAccessKey,
};
const ReactS3Client = new S3(config);

/**
 * uploadAws
 * @param options file onSuccess
 * @param dispatch react hook
 * @param getReceiver
 */

/**
 * Get file type
 * @param fileName
 */
export const getFileType = (fileName: string) => {
  const pdfReg = /^.+(\.pdf|\/pdf)$/;
  const txtReg = /^.+(\/plain|.plain)$/;
  const wordReg = /^.+(\.msword|\.document|\/msword)$/;
  const excelReg = /^.+(\.ms-excel|\.sheet)$/;
  const jpgReg = /^.+(\.png|\.jpg|\.jpeg|\.bmp|\/png|\/jpg|\/jpeg|\/bmp)$/;
  const zipReg = /^.+(\.zip|\/zip)$/;
  if (pdfReg.test(fileName)) {
    return 'pdf';
  }
  if (txtReg.test(fileName)) {
    return 'txt';
  }
  if (wordReg.test(fileName)) {
    return 'word';
  }
  if (excelReg.test(fileName)) {
    return 'excel';
  }
  if (jpgReg.test(fileName)) {
    return 'picture';
  }
  if (zipReg.test(fileName)) {
    return 'zip';
  }
  return 'undefined';
};
/**
 *
 * @param options
 * @param dispatch
 * @returns
 */

export const uploadFileAws3 = (options: any, dispatch: any) => {
  const { file, onSuccess } = options;
  const { name } = file;
  const messageType = getFileType(file.type);

  if (messageType === 'undefined') {
    message.warning('Type does not support uploading');
    return;
  }

  dispatch({
    type: 'upload/changeUploadFileName',
    payload: {
      uploadFileName: name,
      uploadFileType: messageType,
    },
  });

  /**
   * Monitor upload progress
   * @param progressEvent
   */
  const onProgress = (progressEvent: { loaded: number; total: number }) => {
    const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);
    dispatch({
      type: 'upload/changeIsUploading',
      payload: {
        isUploading: true,
      },
    });
    dispatch({
      type: 'upload/changeUploadPercent',
      payload: {
        percentCompleted: percentCompleted,
      },
    });
  };

  ReactS3Client.uploadFile(file, onProgress)
    .then((res) => {
      dispatch({
        type: 'upload/changeIsUploading',
        payload: {
          isUploading: true,
        },
      });

      dispatch({
        type: 'upload/changeUploadFileUrl',
        payload: {
          fileKey: res.key,
          fileUrl: res.location,
          fileName: name,
        },
      });

      onSuccess(res, file);
    })
    .catch((err: any) => {
      dispatch({
        type: 'upload/changeIsUploading',
        payload: {
          isUploading: false,
        },
      });

      dispatch({
        type: 'upload/changeUploadFileName',
        payload: {
          uploadFileName: '',
        },
      });

      dispatch({
        type: 'upload/changeUploadPercent',
        payload: {
          uploadPercent: 0,
        },
      });

      if (err.message === 'cancel') {
        message.success('Cancel upload successful');
      } else {
        message.error('Upload failed');
      }
    });
};

models目录下----upload的方法封装

import type { Effect, ImmerReducer } from 'umi';

export interface UploadState {
  uploadFile: {
    fileKey: string;
    fileUrl: string;
    fileName: string;
  };
  uploadFileName: string;
  isChatUpload: boolean;
  //uploadPercent
  uploadPercent?: number;
  // is uploading
  isUploading?: boolean;
  uploadFileType?: string;
  uploadFileList?: any;
}

interface UploadType {
  namespace: 'upload';
  state: UploadState;
  effects: {
    changePhoto: Effect;
  };
  reducers: {
    changeUploadFileName: ImmerReducer<UploadState>;
    changeUploadFileUrl: ImmerReducer<UploadState>;
    changeIsUploading: ImmerReducer<UploadState>;
    changeUploadPercent: ImmerReducer<UploadState>;
    changeIsChatUpload: ImmerReducer<UploadState>;
  };
}

const UploadModel: UploadType = {
  namespace: 'upload',
  state: {
    uploadFile: {
      fileKey: '',
      fileUrl: '',
      fileName: '',
    },
    uploadFileName: '',
    isChatUpload: true,
    uploadPercent: 0,
    isUploading: false,
  },
  effects: {
    *changePhoto(action, { put }) {
      yield put({
        type: 'changeUploadFileName',
        payload: {
          uploadFileName: '',
        },
      });
    },
  },
  reducers: {
    changeUploadFileName(state, { payload }) {
      return {
        ...state,
        uploadFileName: payload.uploadFileName,
        uploadFileType: payload.uploadFileType,
        // uploadFileList:payload.uploadFileList
      };
    },
    changeUploadFileUrl(state, { payload }) {
      const { fileUrl, fileName, fileKey } = payload;
      return {
        ...state,
        uploadFile: {
          fileKey,
          fileName,
          fileUrl,
        },
      };
    },
    changeIsUploading(state, { payload }) {
      console.log(payload);
      return {
        ...state,
        isUploading: payload.isUploading,
      };
    },
    changeUploadPercent(state, { payload }) {
      return {
        ...state,
        uploadPercent: payload.percentCompleted,
      };
    },
    changeIsChatUpload(state, { payload }) {
      return {
        ...state,
        isChatUpload: payload.isChatUpload,
      };
    },
  },
};

export default UploadModel;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在React中上传文件到OSS,你需要使用OSS SDK来实现。以下是一个简单的步骤: 1. 安装OSS SDK 你可以使用npm或yarn来安装阿里云OSS SDK。在终端中输入以下命令: ``` npm install ali-oss --save ``` 2. 导入OSS SDK 在你的React组件中导入OSS SDK: ``` import OSS from 'ali-oss'; ``` 3. 创建OSS客户端 在使用OSS SDK之前,你需要创建一个OSS客户端。你需要提供你的Access Key ID、Access Key Secret和Endpoint等信息。 ``` const client = new OSS({ accessKeyId: 'your_access_key_id', accessKeySecret: 'your_access_key_secret', endpoint: 'your_endpoint', bucket: 'your_bucket_name' }); ``` 4. 上传文件 现在你可以使用OSS SDK来上传文件。以下是一个简单的示例: ``` const uploadFile = async (file) => { try { // 生成唯一的文件名 const fileName = Date.now() + '-' + file.name; // 上传文件 const result = await client.put(fileName, file); // 获取文件的URL const fileURL = result.url; // 返回文件的URL return fileURL; } catch (error) { console.log(error); throw error; } } ``` 在这个示例中,我们首先生成一个唯一的文件名,然后使用`client.put`方法来上传文件。上传成功后,我们获取文件的URL并返回它。 5. 调用上传方法 最后,在你的React组件中调用上传方法: ``` <input type="file" onChange={async (event) => { const file = event.target.files[0]; const fileURL = await uploadFile(file); console.log(fileURL); }} /> ``` 在这个示例中,我们在一个`<input>`元素的`onChange`事件中调用上传方法。当用户选择一个文件后,我们将文件传递给`uploadFile`方法,并在上传完成后打印文件的URL。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值