# Uploader 上傳
### 介紹
用於將本地的圖片或文件上傳至服務器。
### 安裝
``` ts
import { Uploader } from '@nutui/nutui-react';
```
### 基本用法
:::demo
``` tsx
import React, { useState } from "react";
import { Uploader } from '@nutui/nutui-react';
const App = () => {
const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
const onStart = () => {
console.log('start 觸發')
}
return (
<>
基本用法
>
)
}
export default App;
```
:::
### 上传状态
:::demo
``` tsx
import React, { useState } from "react";
import { Uploader } from '@nutui/nutui-react';
const App = () => {
const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
const defaultFileList: FileType[] = [
{
name: '檔1.png',
url: 'https://m.360buyimg.com/babel/jfs/t1/164410/22/25162/93384/616eac6cE6c711350/0cac53c1b82e1b05.gif',
status: 'success',
message: '上傳成功',
type: 'image',
uid: '123',
},
{
name: '檔2.png',
url: 'https://m.360buyimg.com/babel/jfs/t1/164410/22/25162/93384/616eac6cE6c711350/0cac53c1b82e1b05.gif',
status: 'error',
message: '上傳失敗',
type: 'image',
uid: '124',
},
{
name: '檔3.png',
url: 'https://m.360buyimg.com/babel/jfs/t1/164410/22/25162/93384/616eac6cE6c711350/0cac53c1b82e1b05.gif',
status: 'uploading',
message: '上傳中...',
type: 'image',
uid: '125',
},
]
const onDelete = (file: FileItem, fileList: FileItem[]) => {
console.log(translated.ca3903f3, file, fileList)
}
return (
<>
上傳狀態
>
)
}
export default App;
```
:::
### 自定義上傳樣式
:::demo
``` tsx
import React, { useState } from "react";
import { Uploader, Button } from '@nutui/nutui-react';
const App = () => {
const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
return (
<>
自定義上傳樣式
>
)
}
export default App;
```
:::
### 自定義上傳使用默認進度條
:::demo
``` tsx
import React, { useState } from "react";
import { Uploader, Button, Progress } from '@nutui/nutui-react';
const App = () => {
const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
const [progressPercent, setProgressPercent] = useState(0)
const onProgress = ({ event, options, percentage }: any) => {
setProgressPercent(percentage)
}
return (
<>
自定義上傳使用默認進度條
>
)
}
export default App;
```
:::
### 直接調起攝像頭(移動端生效)
:::demo
``` tsx
import React, { useState } from "react";
import { Uploader, Button } from '@nutui/nutui-react';
const App = () => {
const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
return (
<>
直接調起攝像頭(移動端生效)
>
)
}
export default App;
```
:::
### 限制上傳數量5個
:::demo
``` tsx
import React, { useState } from "react";
import { Uploader, Button } from '@nutui/nutui-react';
const App = () => {
const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
return (
<>
限制上傳數量5個
>
)
}
export default App;
```
:::
### 限制上傳大小(每個文件最大不超過 50kb)
:::demo
``` tsx
import React, { useState } from "react";
import { Uploader, Button } from '@nutui/nutui-react';
const App = () => {
const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
const onOversize = (files: File[]) => {
console.log('oversize 觸發 文件大小不能超過 50kb', files)
}
return (
<>
限制上傳大小(每個文件最大不超過 50kb)
>
)
}
export default App;
```
:::
### 自定義 FormData headers
:::demo
``` tsx
import React, { useState } from "react";
import { Uploader, Button } from '@nutui/nutui-react';
const App = () => {
const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
const formData = {
custom: 'test',
}
return (
<>
自定義 FormData headers
>
)
}
export default App;
```
:::
### 自定義 xhr 上傳方式(before-xhr-upload)
:::demo
``` tsx
import React, { useState } from "react";
import { Uploader, Button } from '@nutui/nutui-react';
const App = () => {
const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
const beforeXhrUpload = (xhr: XMLHttpRequest, options: any) => {
if (options.method.toLowerCase() == 'put') {
xhr.send(options.sourceFile);
} else {
xhr.send(options.formData);
}
};
return (
<>
自定義 xhr 上傳方式(before-xhr-upload)
>
)
}
export default App;
```
:::
### 手動上傳
:::demo
``` tsx
import React, { useState, useRef } from "react";
import { Uploader, Button } from '@nutui/nutui-react';
const App = () => {
const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
const uploadRef = useRef(null)
const submitUpload = () => {
uploadRef.current.submit()
}
return (
<>
手動上傳
>
)
}
export default App;
```
:::
### 禁用狀態
:::demo
``` tsx
import React, { useState } from "react";
import { Uploader, Button } from '@nutui/nutui-react';
const App = () => {
return (
<>
禁用狀態
>
)
}
export default App;
```
:::
### Prop
| 字段 | 說明 | 類型 | 默認值 |
|-------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------|------------------|
| autoUpload | 是否在選取文件後立即進行上傳,false 時需要手動執行 ref submit 方法進行上傳 | Boolean | true |
| name | `input` 標籤 `name` 的名稱,發到後台的文件參數名 | String | "file" |
| url | 上傳服務器的接口地址 | String | - |
| defaultFileList | 默認已經上傳的文件列表 | FileItem[] | [] |
| isPreview | 是否上傳成功後展示預覽圖 | Boolean | true |
| defaultImg | 當上傳非圖片('image')格式的默認圖片地址 | String | '' |
| isDeletable | 是否展示刪除按鈕 | Boolean | true |
| method | 上傳請求的 http method | String | "post" |
| listType | 上傳列表的內建樣式,支持兩種基本樣式 picture、list | String | "picture" |
| capture | 圖片[選取模式](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/input#htmlattrdefcapture),直接調起攝像頭 | String | false |
| maximize | 可以設定最大上傳文件的大小(字節) | Number丨String | Number.MAX_VALUE |
| maximum | 文件上傳數量限制 | Number丨String | 1 |
| clearInput | 是否需要清空`input`內容,設為`true`支持重複選擇上傳同一個文件 | Boolean | false |
| accept | 允許上傳的文件類型,[詳細說明](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/Input/file#%E9%99%90%E5%88%B6%E5%85%81%E8%AE%B8%E7%9A%84%E6%96%87%E4%BB%B6%E7%B1%BB%E5%9E%8B) | String | * |
| headers | 設置上傳的請求頭部 | Object | {} |
| data | 附加上傳的信息 formData | Object | {} |
| uploadIcon | 上傳區域[圖標名稱](#/zh-CN/icon)或圖片鏈接 | String | "photograph" |
| uploadIconSize | 上傳區域[圖標尺寸](#/icon)大小,如 `20px` `2em` `2rem` | String or Number | - |
| xhrState | 接口響應的成功狀態(status)值 | Number | 200 |
| withCredentials | 支持發送 cookie 憑證信息 | Boolean | fasle |
| multiple | 是否支持文件多選 | Boolean | fasle |
| disabled | 是否禁用文件上傳 | Boolean | fasle |
| timeout | 超時時間,單位為毫秒 | Number丨String | 1000 * 30 |
| onBeforeUpload | 上傳前的函數需要返回一個`Promise`對象 | Function | null |
| onBeforeXhrUpload | 執行 XHR 上傳時,自定義方式 | Function(xhr,option) | null |
| onBeforeDelete | 除文件時的回調,返回值為 false 時不移除。支持返回一個 `Promise` 對象,`Promise` 對象 resolve(false) 或 reject 時不移除 | Function(file): boolean 丨Promise | - |
### FileItem
| 名稱 | 說明 | 默認值 |
|----------|---------------------------------------------------------|---------------------------------|
| status | 文件狀態值,可選'ready,uploading,success,error,removed' | "ready" |
| uid | 文件的唯一標識 | new Date().getTime().toString() |
| name | 文件名稱 | "" |
| url | 文件路徑 | "" |
| type | 文件類型 | "image/jpeg" |
| formData | 上傳所需的data | new FormData() |
### Event
| 名稱 | 說明 | 回調參數 |
|----------|------------------------|----------------------|
| onStart | 文件上傳開始 | options |
| onProgress | 文件上傳的進度 | event,options,percentage |
| onOversize | 文件大小超過限制時觸發 | files |
| onSuccess | 上傳成功 | responseText,options |
| onFailure | 上傳失敗 | responseText,options |
| onChange | 上傳文件改變時的狀態 | fileList,event |
| onRemove | 文件刪除之前的狀態 | files,fileList |
| onFileItemClick | 文件上傳成功後點擊觸發 | fileItem |