Skip to content

Commit 8588c4e

Browse files
authored
fix(uploader): beforeUpload failed to work (#3219)
* fix(uploader): beforeUpload failed to work * fix(uploader): add unit tests
1 parent 854658e commit 8588c4e

File tree

4 files changed

+76
-9
lines changed

4 files changed

+76
-9
lines changed

src/packages/uploader/__tests__/uploader.spec.tsx

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,3 +453,63 @@ test('preview component', () => {
453453
)
454454
expect(clickFunc).toBeCalled()
455455
})
456+
test('should handle beforeUpload function', async () => {
457+
const handleUpload = vi.fn()
458+
const beforeUpload = vi.fn((files) => {
459+
// 只允许 PNG 文件通过
460+
return files.filter((file) => file.type === 'image/png')
461+
})
462+
463+
const { container } = render(
464+
<Uploader
465+
upload={(file: File) => handleUpload(file)}
466+
beforeUpload={beforeUpload}
467+
/>
468+
)
469+
470+
const pngFile = new File([new ArrayBuffer(10000)], 'test.png', {
471+
type: 'image/png',
472+
})
473+
const jpgFile = new File([new ArrayBuffer(10000)], 'test.jpg', {
474+
type: 'image/jpeg',
475+
})
476+
477+
const input: any = container.querySelector('input')
478+
479+
// 测试单个 PNG 文件上传
480+
await fireEvent.change(input, { target: { files: [pngFile] } })
481+
expect(beforeUpload).toHaveBeenCalledTimes(1)
482+
expect(handleUpload).toHaveBeenCalledWith(pngFile)
483+
484+
// 测试单个 JPG 文件被过滤
485+
await fireEvent.change(input, { target: { files: [jpgFile] } })
486+
expect(beforeUpload).toHaveBeenCalledTimes(2)
487+
expect(handleUpload).not.toHaveBeenCalledWith(jpgFile)
488+
489+
// 测试多文件上传时的过滤
490+
await fireEvent.change(input, { target: { files: [pngFile, jpgFile] } })
491+
expect(beforeUpload).toHaveBeenCalledTimes(3)
492+
expect(handleUpload).toHaveBeenCalledTimes(2) // 只有 PNG 文件被上传
493+
})
494+
495+
test('should handle beforeUpload returning empty array', async () => {
496+
const handleUpload = vi.fn()
497+
const beforeUpload = vi.fn(() => [])
498+
499+
const { container } = render(
500+
<Uploader
501+
upload={(file: File) => handleUpload(file)}
502+
beforeUpload={beforeUpload}
503+
/>
504+
)
505+
506+
const file = new File([new ArrayBuffer(10000)], 'test.txt', {
507+
type: 'text/plain',
508+
})
509+
510+
const input: any = container.querySelector('input')
511+
await fireEvent.change(input, { target: { files: [file] } })
512+
513+
expect(beforeUpload).toHaveBeenCalled()
514+
expect(handleUpload).not.toHaveBeenCalled()
515+
})

src/packages/uploader/demos/h5/demo1.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ const Demo1 = () => {
77
{
88
url: 'https://m.360buyimg.com/babel/jfs/t1/164410/22/25162/93384/616eac6cE6c711350/0cac53c1b82e1b05.gif',
99
uid: 133,
10-
status: 'uploading',
1110
},
1211
])
1312

src/packages/uploader/uploader.taro.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -314,16 +314,19 @@ const InternalUploader: ForwardRefRenderFunction<
314314
}
315315

316316
const onChangeImage = async (res: Taro.chooseImage.SuccessCallbackResult) => {
317-
// 返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片
318317
const { tempFiles } = res
319318
const _files: Taro.chooseImage.ImageFile[] = filterFiles(tempFiles)
320-
let files: File[] = []
321-
const filesArr = new Array<File>().slice.call(files)
322319
if (beforeUpload) {
323-
files = await beforeUpload(filesArr)
320+
beforeUpload(new Array<File>().slice.call(_files)).then(
321+
(f: Array<File> | boolean) => {
322+
const _files: File[] = filterFiles(new Array<File>().slice.call(f))
323+
if (!_files.length) res.tempFiles = []
324+
readFile(_files)
325+
}
326+
)
327+
} else {
328+
readFile(_files)
324329
}
325-
files = filterFiles(filesArr)
326-
readFile(_files)
327330
}
328331

329332
const handleItemClick = (file: UploaderFileItem, index: number) => {

src/packages/uploader/uploader.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,14 @@ const InternalUploader: ForwardRefRenderFunction<
163163
const filesArr = new Array<File>().slice.call(files)
164164
if (beforeUpload) {
165165
_files = await beforeUpload(filesArr)
166-
if (!_files.length) $el.value = ''
166+
if (!_files.length) {
167+
$el.value = ''
168+
return
169+
}
170+
} else {
171+
_files = filesArr
167172
}
168-
_files = filterFiles(filesArr)
173+
_files = filterFiles(_files)
169174

170175
const tasks = _files.map((file) => {
171176
const info: any = {

0 commit comments

Comments
 (0)