Upload 上传组件

如果项目中使用的是 1.x 版本的基础组件(@alifd/next),请在左侧导航顶部切换组件版本。

安装方法

  1. 在命令行中执行以下命令npm install @icedesign/base@latest -S

开发指南

何时使用

用户根据提示将自己本地的相应信息(包含本地和云储存)上传到网站,上传组件可以帮助用户对上传过程和上传结果有预期,并可以更改或撤销上传行为。

onChange

文件状态改变的回调,返回为:

  1. {
  2. file: { ... },
  3. fileList: [ ... ],
  4. event: { ... }
  5. }
  • file 当前操作的文件对象。
  1. {
  2. uid: 'uid', // 文件唯一标识,建议设置为负数,防止和内部产生的 id 冲突
  3. name: 'xx.png' // 文件名
  4. status: 'done', // 状态有:uploading done error removed
  5. response: '{"status":"success"}' // 服务端响应内容
  6. fileURL: '<http://kfupload.example.com/kf-down/HTB1dRttMXXXXXaxaXXXq6xXFXXXU.jpg?size=23616&height=200&width=200&hash=58d62cf6a9633667b9d728d7120a9350>',
  7. imgURL: '<http://kfupload.example.com/kf-down/HTB1dRttMXXXXXaxaXXXq6xXFXXXU.jpg?size=23616&height=200&width=200&hash=58d62cf6a9633667b9d728d7120a9350>',
  8. }

如果上传控件是 multiple 时,此参数将为一个对象数组 [file, …]

  • fileList 当前的文件列表。

  • event 上传中的服务端响应内容,包含了上传进度等信息,高级浏览器支持。

onSuccess(res, file)

  • res 后台返回的响应信息。

  • file 当前操作的文件对象。

  1. { uid: 'uid', // 文件唯一标识,建议设置为负数,防止和内部产生的 id 冲突 name: 'xx.png' // 文件名 status: 'done', // 状态 response: '{"status": "success"}' // 服务端响应内容 fileURL: '<http://kfupload.example.com/kf-down/HTB1dRttMXXXXXaxaXXXq6xXFXXXU.jpg?size=23616&height=200&width=200&hash=58d62cf6a9633667b9d728d7120a9350>', imgURL: '<http://kfupload.example.com/kf-down/HTB1dRttMXXXXXaxaXXXq6xXFXXXU.jpg?size=23616&height=200&width=200&hash=58d62cf6a9633667b9d728d7120a9350>', }

onRemove(file, fileList)

  • file 当前操作的文件对象。
  1. {
  2. uid: 'uid', // 文件唯一标识,建议设置为负数,防止和内部产生的 id 冲突
  3. name: 'xx.png' // 文件名
  4. status: 'removed', // 状态
  5. response: '{"status": "success"}' // 服务端响应内容
  6. fileURL: '<http://kfupload.example.com/kf-down/HTB1dRttMXXXXXaxaXXXq6xXFXXXU.jpg?size=23616&height=200&width=200&hash=58d62cf6a9633667b9d728d7120a9350>',
  7. imgURL: '<http://kfupload.example.com/kf-down/HTB1dRttMXXXXXaxaXXXq6xXFXXXU.jpg?size=23616&height=200&width=200&hash=58d62cf6a9633667b9d728d7120a9350>',
  8. }
  • fileList 当前的文件列表。

显示下载链接

请使用 fileList 属性设置数组项的 url 属性进行展示控制。

返回数据格式要求

  1. // 标准 JSON 字符串
  2. {
  3. "code": "0", // 状态码,0 代表成功
  4. "imgURL": "http://kfupload.example.com/a.png", // 图片预览地址
  5. "downloadURL": "http://kfupload.example.com/a.png", // 文件下载地址 (可选)
  6. "size": "1024", // 文件大小 (可选)
  7. "fileHeight": "50", // 图片高度,非图片类型不需要 (可选)
  8. "fileWidth": "50", // 图片宽度,非图片类型不需要 (可选)
  9. "fileMd5": "ddahsjccbajh" // 文件 hash 值 (可选)
  10. }

后端数据格式化

通过 formatter 将来自后端的不规则数据转换为符合组件要求的数据格式

  • 假设 服务器的响应数据如下
  1. {
  2. "status": "success", // 上传成功返回码
  3. "img_src": "<http://kfupload.example.com/a.jpg>", // 图片链接
  4. "img_size": 1024 // 文件大小
  5. }
  • 转换方法
  1. // 函数里面根据当前服务器返回的响应数据
  2. // 重新拼装符合组件要求的数据格式
  3. function formatter(res) {
  4. return {
  5. code: res.status === 'success' ? '0' : '1',
  6. imgURL: res.img_src,
  7. size: res.img_size
  8. };
  9. }

IE9兼容性

  • ie9 下用因为使用 iframe 作为无刷新上传方案,必须保证表单页面的域名和上传的服务器端的域名相同。

  • ie9 下服务器端返回数据需要设置头部 context-typetext/html,不要设置为 application/json

  • 如果只是一级域名相同(taobao.com 为一级域名 shop.taobao.com 为二级域名),可以通过降域的方式实现跨域上传。

假设你表单页面的域是:shop.taobao.com,而上传的服务器端路径却是 upload.taobao.com。服务端返回必须带额外 scrip t标签

  1. <script>document.domain = "taobao.com";</script>
  2. {"status":1,"type":"ajax","name":"54.png","url":".\/files\/54.png"}

iframe上传会额外传递参数 _documentDomain 方便你设置域名

API

上传组件

参数说明类型默认值
prefix样式前缀String'next-'
action必选参数,上传的地址String'//kfupload.example.com/mupload'
fileList上传文件列表,数据格式请参考Array-
defaultFileList默认上传文件列表,数据格式请参考Array[]
listType上传列表的样式可选值:'text'(文字)'text-image'(图文)'picture-card'(卡片)Enum'text'
data上传额外传参(如果使用 fileserver 上传,参数格式为 { scene: '场景名' })Object/Function-
formatter数据格式化函数,配合自定义 action 使用,参数为服务器的响应数据,详见 formatter签名:Function() => voidFunction-
maxSize选择上传的文件的最大尺寸(单位:Byte)NumberInfinity
language语言种类,支持 en-uszh-cnzh-twString-
locale自定义语言包,会与默认提供的语言包做合并操作,详细参考Object-
limit最大文件上传个数Number-
dragable可选参数,是否支持拖拽上传,ie10+ 支持。Booleantrue
disabled可选参数,是否禁用上传功能Boolean-
showUploadList是否显示上传列表Booleantrue
onChange上传文件改变时的状态签名:Function(info: Object) => void参数:info: {Object} 文件事件对象Function() => {}
onSuccess可选参数,上传成功回调函数,参数为请求下响应信息以及文件签名:Function() => voidFunction() => {}
onRemove移除文件回调函数,详见 onRemove签名:Function() => voidFunction() => {}
onError可选参数,上传失败回调函数,参数为上传失败的信息、响应信息以及文件签名:Function() => voidFunction() => {}
className自定义classString-
style自定义内联样式Object-
children子元素ReactNode-
accept可选参数,接受上传的文件类型,详见 input accept attribute兼容性见String-
headers可选参数,设置上传的请求头部Object-
name传递给服务器的文件参数String-
withCredentials可选参数,是否允许请求携带 cookieBoolean-
beforeUpload可选参数,上传文件之前的钩子,参数为上传的文件,若返回 false 则停止上传签名:Function() => voidFunction-

Upload.ImageUpload

Upload.DragUpload

参数说明类型默认值
prefix样式前缀String'next-'
onDragOver可选参数,拖拽到达拖拽区域回调函数签名:Function() => voidFunction-
onDrop可选参数,拖拽释放回调函数,参数为拖拽的文件签名:Function() => voidFunction-
className自定义类名String-
style自定义内联样式Object-

Upload.CropUpload

参数说明类型默认值
prefix样式前缀String'next-'
action必选参数,上传的地址。使用 fileserver,跨域解决方案参考 fileserver 接入code非 fileserverString'//kfupload.example.com/mupload'
name可选参数,传递给服务器的文件参数String'avatar'
cropSize可选参数,设置裁剪图片生成的尺寸,如设置 100,会生成 100100 的图片Number/Object-
minCropBoxSize可选参数,设置裁剪框的最小尺寸Number-
className自定义类名String-
style自定义内联样式Object-
headers可选参数,设置上传的请求头部Object-
formatter可选参数,数据格式化函数,配合自定义 action 使用,参数为服务器的响应数据,详见 formatter签名:Function() => voidFunction-
data上传额外传参(如果使用 fileserver 上传,参数格式为 { scene: '场景名' })Object/Function-
locale自定义语言包,会与默认提供的语言包做合并操作,请严格按照默认语言包的格式,参考 demoObject-
preview是否使用预览功能Boolean-
previewList预览展示列表,用来配置预览元素。目前仅支持 806040 三种,例如,配置 [80, 40],会展示 8080 以及 4040 两种尺寸Array-
popupClassName裁剪弹层自定义类名String-
aspectRatio裁剪比例,例如 1 / 2 表示 宽 / 高注意:1、设置了裁剪比例,而且值不等于 1 时,不能使用预览功能;2、设置成 'auto' 可以支持任意裁剪比例Number-
viewMode可选参数,定义裁剪框的模式Number-
autoCropArea可选参数,定义自动裁剪区域的尺寸(百分比),介于 01 之间的值Number-
zoomable图片是否可以伸缩Boolean-
beforeCrop可选参数,选择文件后、唤起裁剪框前的钩子,参数为上传的文件。若返回 falsePromise.reject() 或者 Promise.resolve(false) 都会阻断后续流程,不会唤起裁剪框及后续动作签名:Function() => voidFunction-
onCrop完成裁剪并上传的回调函数,参数为裁剪后的文件的base64字符串数据签名:Function() => voidFunction() => { }
onChange可选参数,裁剪文件改变时触发签名:Function() => voidFunction() => { }
beforeUpload可选参数,点击裁剪之后、上传文件之前的钩子,参数为上传的文件,若返回 false 则停止上传签名:Function() => voidFunction() => { }
onSuccess上传成功回调函数,res 为后台响应,dataUrl 为裁剪后的文件的base64字符串数据(注意与 Upload 的参数区别)签名:Function() => voidFunction() => { }
onError可选参数,上传失败回调函数,参数为上传失败的文件信息*签名:Function() => voidFunction() => { }
accept图片类型String'image/png,image/jpg,image/jpeg,image/bmp,image/gif'

Upload.Core

参数说明类型默认值
style可选参数,自定义样式Object-
action必选参数,上传的地址String-
name可选参数,传递给服务器的文件参数String'file'
disabled可选参数,是否禁用上传功能Boolean-
multiple可选参数,是否支持多选文件,ie10+ 支持。开启后按住 ctrl 可选择多个文件Booleanfalse
dragable可选参数,是否支持拖拽上传,ie10+ 支持。Boolean-
accept可选参数,接受上传的文件类型,详见 input accept attribute兼容性见String-
data上传额外传参Object/Function-
headers可选参数,设置上传的请求头部Object-
withCredentials可选参数,是否允许请求携带 cookieBooleanfalse
beforeUpload可选参数,上传文件之前的钩子,参数为上传的文件,若返回 false 则停止上传签名:Function() => voidFunction() => { }
onStart可选参数,开始上传文件的钩子,参数为上传的文件。如果开启了 multiple,参数为文件列表签名:Function() => voidFunction() => { }
onProgress可选参数,正在上传文件的钩子,参数为上传的事件以及文件签名:Function() => voidFunction() => { }
onSuccess可选参数,上传成功回调函数,参数为请求下响应信息以及文件签名:Function() => voidFunction() => { }
onError可选参数,上传失败回调函数,参数为上传失败的信息、响应信息以及文件签名:Function() => voidFunction() => { }
onAbort可选参数,中断上传请求回调函数,参数为中断事件以及文件签名:Function() => voidFunction() => { }

Upload.List

参数说明类型默认值
listType文件列表,数据格式请参考 文件对象可选值:'text', 'text-image', 'picture-card'Enum'text'
fileList文件列表Array[]
cell渲染签名:Function(value: Object, idx: Number) => Element参数:value: {Object} 该行数据idx: {Number} 序列返回值:{Element} 自定义内容Function-

方法

签名:Function(e: Event) => void参数:e: {Event} 拖拽事件返回值:{void} null

签名:Function(files: FileList) => void参数:files: {FileList} 文件列表返回值:{void} null

签名:Function(response: Object, file: File) => void参数:response: {Object} 服务器响应file: {File} 文件对象返回值:{void} null

签名:Function(file: File) => void参数:file: {File} null返回值:{void} null

签名:Function(file: File) => void参数:file: {File} null返回值:{void} null

代码示例

核心上传

Upload 上传组件 - 图1

查看源码在线预览

  1. import { Upload, Button } from "@icedesign/base";
  2. const { Core } = Upload;
  3. class UploadCore extends React.Component {
  4. constructor(props) {
  5. super(props);
  6. this.state = {
  7. disabled: false,
  8. dragable: false
  9. };
  10. /* eslint-disable */
  11. ["onDisabledHandler", "onDragableHandler", "onAbortHandler"].map(fn => {
  12. this[fn] = this[fn].bind(this);
  13. });
  14. /* eslint-enable */
  15. }
  16. onDisabledHandler() {
  17. this.setState({
  18. disabled: !this.state.disabled
  19. });
  20. }
  21. onDragableHandler() {
  22. this.setState({
  23. dragable: !this.state.dragable
  24. });
  25. }
  26. onAbortHandler() {
  27. this.refs.inner.abort();
  28. }
  29. render() {
  30. return (
  31. <div>
  32. <Core
  33. ref="inner"
  34. style={{
  35. display: "block",
  36. textAlign: "center",
  37. width: "200px",
  38. height: "150px",
  39. lineHeight: "150px",
  40. border: "1px dashed #aaa",
  41. borderRadius: "5px",
  42. fontSize: "12px"
  43. }}
  44. action="//www.easy-mock.com/mock/5b960dce7db69152d06475bc/ice/upload" // 该接口仅作测试使用,业务请勿使用
  45. accept="image/png, image/jpg, image/jpeg, image/gif, image/bmp"
  46. name="filename"
  47. disabled={this.state.disabled}
  48. multiple
  49. dragable={this.state.dragable}
  50. multipart={{ _token: "sdj23da" }}
  51. headers={{ Authorization: "user_1" }}
  52. beforeUpload={beforeUpload}
  53. onStart={onStart}
  54. onProgress={onProgress}
  55. onSuccess={onSuccess}
  56. onError={onError}
  57. onAbort={onAbort}
  58. >
  59. {this.state.disabled
  60. ? "禁止上传"
  61. : this.state.dragable ? "支持点击或者拖拽上传" : "支持点击上传"}
  62. </Core>
  63. <br />
  64. <div>
  65. <Button type="primary" onClick={this.onDisabledHandler}>
  66. 切换 disabled 状态
  67. </Button>&nbsp;
  68. <Button type="primary" onClick={this.onDragableHandler}>
  69. 切换 dragable 状态
  70. </Button>&nbsp;
  71. <Button type="primary" onClick={this.onAbortHandler}>
  72. 中断全部上传
  73. </Button>
  74. </div>
  75. </div>
  76. );
  77. }
  78. }
  79. ReactDOM.render(<UploadCore />, mountNode);
  80. function beforeUpload(file) {
  81. console.log("beforeUpload callback : ", file);
  82. }
  83. function onStart(files) {
  84. console.log("onStart callback : ", files);
  85. }
  86. function onProgress(e, file) {
  87. console.log("onProgress callback : ", e, file);
  88. }
  89. function onSuccess(res, file) {
  90. console.log("onSuccess callback : ", res, file);
  91. }
  92. function onError(err, res, file) {
  93. console.log("onError callback : ", err, res, file);
  94. }
  95. function onAbort(e, file) {
  96. console.log("onAbort callback : ", e, file);
  97. }

裁剪上传

Upload 上传组件 - 图2

查看源码在线预览

  1. import { Upload, Button, Dialog } from "@icedesign/base";
  2. const { CropUpload } = Upload;
  3. class CropUploadApp extends React.Component {
  4. constructor(props) {
  5. super(props);
  6. this.onSuccess = this.onSuccess.bind(this);
  7. }
  8. beforeCrop(file) {
  9. console.log("beforeCrop callback : ", file);
  10. // 返回 `false` 的方式
  11. if (file.size > 1024 * 1024 * 3) {
  12. Dialog.alert({
  13. content: "图片尺寸超过最大限制 3MB,请重新选择!",
  14. closable: false,
  15. title: "裁剪提醒"
  16. });
  17. return false;
  18. }
  19. // 返回 `promise` 的方式
  20. return new Promise((resolve, reject) => {
  21. const reader = new FileReader();
  22. reader.onload = () => {
  23. const img = new Image();
  24. img.onload = () => {
  25. if (img.width <= 1200) {
  26. resolve();
  27. } else {
  28. Dialog.alert({
  29. content: `图片宽度为${
  30. img.width
  31. }px, 超过最大限制 1200px,请重新选择!`,
  32. closable: false,
  33. title: "裁剪提醒"
  34. });
  35. reject(); // resolve(false) 也能阻断流程
  36. }
  37. };
  38. img.src = reader.result;
  39. };
  40. reader.readAsDataURL(file);
  41. });
  42. }
  43. onCrop(dataUrl) {
  44. console.log("onCrop callback : ", dataUrl);
  45. }
  46. beforeUpload(file) {
  47. console.log("beforeUpload callback : ", file);
  48. }
  49. onChange(file) {
  50. console.log("onChange callback : ", file);
  51. }
  52. onSuccess(res, dataUrl) {
  53. console.log("onSuccess callback : ", res);
  54. this.refs.targetViewer.src = dataUrl;
  55. }
  56. render() {
  57. return (
  58. <CropUpload
  59. action="//www.easy-mock.com/mock/5b960dce7db69152d06475bc/ice/upload" // 该接口仅作测试使用,业务请勿使用
  60. preview
  61. previewList={[80, 60, 40]}
  62. minCropBoxSize={100}
  63. beforeCrop={this.beforeCrop}
  64. onCrop={this.onCrop}
  65. beforeUpload={this.beforeUpload}
  66. onChange={this.onChange}
  67. onSuccess={this.onSuccess}
  68. >
  69. {/* CropUpload 内嵌的标签会成为呼出系统弹窗的 trigger */}
  70. <Button type="primary" style={{ margin: 0 }}>
  71. 上传头像
  72. </Button>
  73. <div style={{ marginTop: "20px" }}>
  74. <img
  75. ref="targetViewer"
  76. src="https://img.alicdn.com/tps/TB19O79MVXXXXcZXVXXXXXXXXXX-1024-1024.jpg"
  77. width="120px"
  78. height="120px"
  79. />
  80. </div>
  81. {/* trigger end */}
  82. </CropUpload>
  83. );
  84. }
  85. }
  86. ReactDOM.render(<CropUploadApp />, mountNode);

自定义上传参数

next@0.19.5 开始参数从 multipart 改造为 data

Upload 上传组件 - 图3

查看源码在线预览

  1. import { Upload, Button } from "@icedesign/base";
  2. ReactDOM.render(
  3. <Upload
  4. listType="text"
  5. action="//www.easy-mock.com/mock/5b960dce7db69152d06475bc/ice/upload" // 该接口仅作测试使用,业务请勿使用
  6. accept="image/png, image/jpg, image/jpeg, image/gif, image/bmp"
  7. data={{ token: "abcd" }}
  8. beforeUpload={beforeUpload}
  9. onChange={onChange}
  10. defaultFileList={[
  11. {
  12. name: "IMG.png",
  13. status: "done",
  14. size: 1024,
  15. downloadURL:
  16. "https://img.alicdn.com/tps/TB19O79MVXXXXcZXVXXXXXXXXXX-1024-1024.jpg",
  17. fileURL:
  18. "https://img.alicdn.com/tps/TB19O79MVXXXXcZXVXXXXXXXXXX-1024-1024.jpg",
  19. imgURL:
  20. "https://img.alicdn.com/tps/TB19O79MVXXXXcZXVXXXXXXXXXX-1024-1024.jpg"
  21. }
  22. ]}
  23. >
  24. <Button type="primary" style={{ margin: "0 0 10px" }}>
  25. 上传文件
  26. </Button>
  27. </Upload>,
  28. mountNode
  29. );
  30. function beforeUpload(info) {
  31. console.log("beforeUpload callback : ", info);
  32. }
  33. function onChange(info) {
  34. console.log("onChane callback : ", info);
  35. }

拖拽上传

Upload 上传组件 - 图4

查看源码在线预览

  1. import { Upload } from "@icedesign/base";
  2. const { DragUpload } = Upload;
  3. ReactDOM.render(
  4. <DragUpload
  5. action="//www.easy-mock.com/mock/5b960dce7db69152d06475bc/ice/upload" // 该接口仅作测试使用,业务请勿使用
  6. accept="image/png, image/jpg, image/jpeg, image/gif, image/bmp"
  7. onDragOver={onDragOver}
  8. onDrop={onDrop}
  9. />,
  10. mountNode
  11. );
  12. function onDragOver() {
  13. console.log("dragover callback");
  14. }
  15. function onDrop(fileList) {
  16. console.log("drop callback : ", fileList);
  17. }

内容回填

Upload 上传组件 - 图5

查看源码在线预览

  1. import { Upload, Button, Field, Form } from "@icedesign/base";
  2. const { ImageUpload } = Upload;
  3. const FormItem = Form.Item;
  4. const fileList = [
  5. {
  6. name: "pic.png",
  7. fileName: "pic.png",
  8. status: "done",
  9. size: 1000,
  10. downloadURL:
  11. "https://img.alicdn.com/tps/TB19O79MVXXXXcZXVXXXXXXXXXX-1024-1024.jpg",
  12. fileURL:
  13. "https://img.alicdn.com/tps/TB19O79MVXXXXcZXVXXXXXXXXXX-1024-1024.jpg",
  14. imgURL:
  15. "https://img.alicdn.com/tps/TB19O79MVXXXXcZXVXXXXXXXXXX-1024-1024.jpg"
  16. }
  17. ];
  18. class App extends React.Component {
  19. field = new Field(this, {
  20. deepReset: true // 打开清楚特殊类型模式(fileList是数组需要特别开启)
  21. });
  22. setValues = () => {
  23. this.field.setValues({
  24. upload: [...fileList]
  25. });
  26. };
  27. getValues = () => {
  28. const values = this.field.getValues();
  29. console.log(values);
  30. };
  31. normFile = info => {
  32. if (info.file.status === "uploading") {
  33. console.log("正在上传文件,请稍后!");
  34. }
  35. if (info.file.status === "error") {
  36. console.log("上传文件出错,请重新上传!");
  37. }
  38. if (info.file.status === "done") {
  39. console.log("上传文件成功!");
  40. }
  41. if (info.fileList && info.fileList.length) {
  42. return info.fileList;
  43. }
  44. return [];
  45. };
  46. render() {
  47. const init = this.field.init;
  48. return (
  49. <Form field={this.field}>
  50. <FormItem>
  51. <ImageUpload
  52. listType="picture-card"
  53. action="//www.easy-mock.com/mock/5b960dce7db69152d06475bc/ice/upload" // 该接口仅作测试使用,业务请勿使用
  54. accept="image/png, image/jpg, image/jpeg, image/gif, image/bmp"
  55. {...init("upload", {
  56. valueName: "fileList",
  57. initValue: fileList,
  58. getValueFromEvent: this.normFile,
  59. rules: [{ required: true, message: "列表不能为空" }]
  60. })}
  61. />
  62. </FormItem>
  63. <div>
  64. <Button
  65. onClick={this.setValues}
  66. type="primary"
  67. style={{ margin: "0 0 10px" }}
  68. >
  69. 设置数据
  70. </Button>&nbsp;&nbsp;
  71. <Button
  72. onClick={this.getValues}
  73. type="primary"
  74. style={{ margin: "0 0 10px" }}
  75. >
  76. 获取数据
  77. </Button>&nbsp;&nbsp;
  78. <Button
  79. onClick={() => this.field.reset()}
  80. type="primary"
  81. style={{ margin: "0 0 10px" }}
  82. >
  83. 重置
  84. </Button>&nbsp;&nbsp;
  85. <Button
  86. onClick={() => this.field.validate()}
  87. type="primary"
  88. style={{ margin: "0 0 10px" }}
  89. >
  90. 校验
  91. </Button>
  92. </div>
  93. </Form>
  94. );
  95. }
  96. }
  97. ReactDOM.render(<App />, mountNode);

图片上传(卡片式)

Upload 上传组件 - 图6

查看源码在线预览

  1. import { Upload } from "@icedesign/base";
  2. const { ImageUpload } = Upload;
  3. ReactDOM.render(
  4. <ImageUpload
  5. listType="picture-card"
  6. action="//www.easy-mock.com/mock/5b960dce7db69152d06475bc/ice/upload" // 该接口仅作测试使用,业务请勿使用
  7. accept="image/png, image/jpg, image/jpeg, image/gif, image/bmp"
  8. locale={{
  9. image: {
  10. cancel: "取消上传",
  11. addPhoto: "上传图片"
  12. }
  13. }}
  14. beforeUpload={beforeUpload}
  15. onChange={onChange}
  16. onSuccess={onSuccess}
  17. onError={onError}
  18. defaultFileList={[
  19. {
  20. name: "IMG.png",
  21. status: "done",
  22. downloadURL:
  23. "https://img.alicdn.com/tps/TB19O79MVXXXXcZXVXXXXXXXXXX-1024-1024.jpg",
  24. fileURL:
  25. "https://img.alicdn.com/tps/TB19O79MVXXXXcZXVXXXXXXXXXX-1024-1024.jpg",
  26. imgURL:
  27. "https://img.alicdn.com/tps/TB19O79MVXXXXcZXVXXXXXXXXXX-1024-1024.jpg"
  28. }
  29. ]}
  30. />,
  31. mountNode
  32. );
  33. function beforeUpload(info) {
  34. console.log("beforeUpload callback : ", info);
  35. }
  36. function onChange(info) {
  37. console.log("onChane callback : ", info);
  38. }
  39. function onSuccess(res, file) {
  40. console.log("onSuccess callback : ", res, file);
  41. }
  42. function onError(file) {
  43. console.log("onError callback : ", file);
  44. }

文件上传

Upload 上传组件 - 图7

查看源码在线预览

  1. import { Upload } from "@icedesign/base";
  2. const fileList = [
  3. {
  4. fileName: "IMG.png",
  5. status: "done",
  6. size: 1024,
  7. downloadURL:
  8. "https://img.alicdn.com/tps/TB19O79MVXXXXcZXVXXXXXXXXXX-1024-1024.jpg",
  9. fileURL:
  10. "https://img.alicdn.com/tps/TB19O79MVXXXXcZXVXXXXXXXXXX-1024-1024.jpg",
  11. imgURL:
  12. "https://img.alicdn.com/tps/TB19O79MVXXXXcZXVXXXXXXXXXX-1024-1024.jpg"
  13. }
  14. ];
  15. const cell = (file, idx) => {
  16. return (
  17. <div className="custom" key={idx}>
  18. <img src={file.imgURL} />
  19. <span>
  20. <li> {file.fileName} </li>
  21. <li> {file.size / 1024}KB</li>
  22. </span>
  23. </div>
  24. );
  25. };
  26. ReactDOM.render(
  27. <div>
  28. <Upload.List listType="text" fileList={fileList} />
  29. <br />
  30. <Upload.List listType="text-image" fileList={fileList} />
  31. <br />
  32. <Upload.List listType="picture-card" fileList={fileList} />
  33. <br />自定义内容
  34. <Upload.List listType="text-image" cell={cell} fileList={fileList} />
  35. </div>,
  36. mountNode
  37. );
  1. .custom img {
  2. width: 50px;
  3. height: 50px;
  4. float: left;
  5. }
  6. .custom span {
  7. float: left;
  8. color: blue;
  9. margin-left: 10px;
  10. }
  11. .custom li {
  12. list-style: none;
  13. line-height: 25px;
  14. }

图片上传

Upload 上传组件 - 图8

查看源码在线预览

  1. import { Upload, Button } from "@icedesign/base";
  2. ReactDOM.render(
  3. <Upload
  4. listType="text-image"
  5. action="//www.easy-mock.com/mock/5b960dce7db69152d06475bc/ice/upload" // 该接口仅作测试使用,业务请勿使用
  6. accept="image/png, image/jpg, image/jpeg, image/gif, image/bmp"
  7. beforeUpload={beforeUpload}
  8. onChange={onChange}
  9. defaultFileList={[
  10. {
  11. name: "IMG.png",
  12. status: "done",
  13. size: 100,
  14. downloadURL:
  15. "https://img.alicdn.com/tps/TB19O79MVXXXXcZXVXXXXXXXXXX-1024-1024.jpg",
  16. fileURL:
  17. "https://img.alicdn.com/tps/TB19O79MVXXXXcZXVXXXXXXXXXX-1024-1024.jpg",
  18. imgURL:
  19. "https://img.alicdn.com/tps/TB19O79MVXXXXcZXVXXXXXXXXXX-1024-1024.jpg"
  20. }
  21. ]}
  22. >
  23. <Button type="primary" style={{ margin: "0 0 10px" }}>
  24. 上传文件
  25. </Button>
  26. </Upload>,
  27. mountNode
  28. );
  29. function beforeUpload(info) {
  30. console.log("beforeUpload callback : ", info);
  31. }
  32. function onChange(info) {
  33. console.log("onChane callback : ", info);
  34. }

文件上传

Upload 上传组件 - 图9

查看源码在线预览

  1. import { Upload, Button } from "@icedesign/base";
  2. ReactDOM.render(
  3. <Upload
  4. listType="text"
  5. action="//www.easy-mock.com/mock/5b960dce7db69152d06475bc/ice/upload" // 该接口仅作测试使用,业务请勿使用
  6. accept="image/png, image/jpg, image/jpeg, image/gif, image/bmp"
  7. beforeUpload={beforeUpload}
  8. onChange={onChange}
  9. onSuccess={onSuccess}
  10. multiple
  11. defaultFileList={[
  12. {
  13. name: "IMG.png",
  14. status: "done",
  15. size: 1024,
  16. downloadURL:
  17. "https://img.alicdn.com/tps/TB19O79MVXXXXcZXVXXXXXXXXXX-1024-1024.jpg",
  18. fileURL:
  19. "https://img.alicdn.com/tps/TB19O79MVXXXXcZXVXXXXXXXXXX-1024-1024.jpg",
  20. imgURL:
  21. "https://img.alicdn.com/tps/TB19O79MVXXXXcZXVXXXXXXXXXX-1024-1024.jpg"
  22. }
  23. ]}
  24. >
  25. <Button type="primary" style={{ margin: "0 0 10px" }}>
  26. 上传文件
  27. </Button>
  28. </Upload>,
  29. mountNode
  30. );
  31. function beforeUpload(info) {
  32. console.log("beforeUpload : ", info);
  33. }
  34. function onChange(info) {
  35. console.log("onChane : ", info);
  36. }
  37. function onSuccess(info) {
  38. console.log("onSuccess : ", info);
  39. }

相关区块

Upload 上传组件 - 图10

暂无相关区块