UNPKG

react-large-uploader

Version:
175 lines (130 loc) 5.42 kB
## react-large-uploader React component for uploading large file [![build status](https://travis-ci.org/sunyongjian/react-large-uploader.svg?branch=master&style=flat-square)](https://travis-ci.org/sunyongjian/react-large-uploader) [![npm version](https://img.shields.io/npm/v/react-large-uploader.svg?style=flat-square)](https://www.npmjs.com/package/react-large-uploader) [![npm downloads](https://img.shields.io/npm/dm/react-large-uploader.svg?style=flat-square)](https://www.npmjs.com/package/react-large-uploader) ### Installation 请安装最新版本 ``` npm install react-large-uploader --save or yarn add react-large-uploader ``` ### Introduction 由于上传大文件的时候,服务器会有大小的限制,所以前端在上传大文件的时候需要切割上传。此组件支持大文件自动切割并发上传,失败自动继续上传,不刷新页面的端点续传,多文件上传。实现了基本 UI,进度条,状态,继续上传等交互。如果对 UI 没什么要求... 是可以直接拿过去用的。 基于 webuploader 中 html5 处理大文件的功能,对兼容性没有做测试,现代浏览器应该都是兼容的。另外,webuploader 是严重依赖 jquery的。但是我在它的官网看到了有 jquery 的替代品,以为很好就拿过来开发了,然而找了半天没有找到。webuploader 还没有去除对 jquery 的依赖,所以安装的时候会依赖 jq... 强迫症,所以在本来就有 jq 的老项目,我还是忍了... ### Example 组件使用: ```javascript import LargeUploader from 'react-larger-uploader'; import 'react-larger-uploader/lib/css'; const options = { resize: false, auto: true, server: '/upload', }; return ( <LargeUploader options={options} border={false} width={300} onChange={(file) => console.log(file)} > <div>选择</div> </LargeUploader> ); ``` 只需要几个参数就可以完成创建。 ![image1](./example/upload.png) ![image2](./example/upload1.png) 另外 example 目录中,还写了一个简单的接收文件的 server,没有做切片合并的处理,在根目录下的 `start.js`。 ### Usage #### 参数 - options {object} 初始化 webuploader 的配置对象,可以参照 webuploader。 ```js // 默认 { server: '/upload', // request url auto: false, // 添加完文件是否自动上传 chunked: true, // 是否切割 chunkSize: 5 * 1024 * 1024, // 切片大小 chunkRetry: 3, // 切片上传失败重试次数 threads: 1, // 并发数量 fileSizeLimit: 2000 * 1024 * 1024, // 文件总大小的限制,超出则先不加入队列 fileSingleSizeLimit: 2000 * 1024 * 1024, // 单个文件的大小限制,超出不加入队列 } ``` - width {int} 默认 300 区域的大小,为了能更好的展示文件名,进度条,300 是最小的宽度了。 - border {bool} 是否显示边框 - name {string} `defaultValue: 'file'` - onChange(file, fileList) {function} 当文件上传成功、失败或者删除文件的时候调用。第一个参数是 file 对象,具体包括: ```javascript { ext: //后缀名 id: //文件id md5Val: // 整个文件的md5 值,用于后端识别文件。 lastModifiedDate: //最后修改时间 name: //文件名 size: //文件大小 percentage: //百分百 0.5 source: //源 uploadStatus: //状态(成功/失败) type: //mime 类型 response: // 上传成功后,服务器返回的 value error: // 出错的原因, 'server' } ``` 第二个参数为当前的 fileList 数组。 - beforeFileQueued(file) {function} `return: true or false` 文件加入队列之前的回调,可以在这里做文件的校验,拦截。WebUploader 已经帮我们处理了比如文件为空,文件格式不对的,但是没有交互信息。当我们需要把这些信息反馈给用户时,可以在这里做。 返回 true,文件加入队列。 返回 false,文件不加入。 ```javascript const beforeFileQueued = (file) => { if (file.size === 0) { alert('不能上传空文件~'); return false; } if (file.ext !== 'csv') { alert('文件格式有误~'); return false; } return true; } ``` - fillDataBeforeSend {function} `return: object` 自定义参数 用于 uploader 自动发送请求之前,填充 data 对象。此函数返回的对象中数据,都会被 merge 到最终发送的 data 中。不过要注意默认的 key-name,不能和默认的 query 冲突,否则会被覆盖。 - uploadResponse(file, res) {function} `return: true/false` 注册上传操作收到 response 的函数,用于判断是否上传成功。默认是上传返回状态码 200 就认为成功,传入这个函数可以对返回值信息做验证。接收两个参数,1. 当前的 file 文件 2. 接口 response 此函数的返回值,true 表示成功,false 表示失败。 eg: ```js uploadResponse: (file, res) => { const { code } = res; return code === 0; } ``` #### query 默认传给服务器的信息包括: - chunks 切片数量 - chunk 当前序号,从 0 开始 - md5Value 文件的 md5 值,区分文件,合并的唯一标示 - id 同一批次上传的文件的序号,没啥用 - filename 文件名 - size 切片、文件大小