常见问题
关于 Dropup 的常见问题和解答。
通用问题
Dropup 是什么?
Dropup 是一个轻量级的无头 React 文件上传库。它提供拖放功能、文件验证、上传进度追踪和云存储支持——所有这些功能的包大小不到 10KB(gzip 压缩后)。
为什么是"无头"的?
无头意味着 Dropup 不包含任何 UI 组件。它提供逻辑和状态管理,而您可以按照自己的方式构建 UI。这让您可以完全控制外观和交互。
包大小是多少?
- 核心包 (
@samithahansaka/dropup):< 10KB gzip - 包含云存储支持:每个提供商 +2KB
- 包含图片处理:+5KB
- 包含 tus 协议:+3KB(需要 tus-js-client 作为对等依赖)
支持 TypeScript 吗?
是的!Dropup 使用 TypeScript 编写,包含完整的类型定义。不需要额外安装 @types 包。
需要什么版本的 React?
React 16.8+(需要 hooks 支持)。
使用方法
如何上传文件?
const { files, actions } = useDropup({
upload: { url: '/api/upload' },
});
// 上传所有文件
actions.upload();
// 上传特定文件
actions.upload(['file-id-1', 'file-id-2']);
如何处理验证错误?
useDropup({
accept: 'image/*',
maxSize: 5 * 1024 * 1024,
onValidationError: (errors) => {
errors.forEach(({ file, errors }) => {
console.log(`${file.name}: ${errors.join(', ')}`);
});
},
});
可以使用自定义上传逻辑吗?
可以!传入函数而不是配置对象:
useDropup({
upload: async (file, options) => {
const { signal, onProgress } = options;
// 您的自定义上传逻辑
const response = await customUpload(file.file, {
signal,
onProgress,
});
return { url: response.url };
},
});
如何以编程方式添加文件?
const { actions } = useDropup();
// 从剪贴板
document.addEventListener('paste', (e) => {
const files = e.clipboardData?.files;
if (files) {
actions.addFiles(files);
}
});
可以有多个拖放区域吗?
可以!每次调用 useDropup 都会创建一个独立的实例:
const images = useDropup({ accept: 'image/*' });
const documents = useDropup({ accept: '.pdf' });
// 分别使用
<div {...images.getDropProps()}>...</div>
<div {...documents.getDropProps()}>...</div>
上传
如何显示上传进度?
const { files } = useDropup({ upload: { url: '/api/upload' } });
{files.map(file => (
<div key={file.id}>
{file.name}: {file.progress}%
</div>
))}
如何取消上传?
const { actions } = useDropup();
// 取消特定文件
actions.cancel('file-id');
// 取消所有上传
actions.cancel();
如何重试失败的上传?
const { actions } = useDropup();
// 重试特定文件
actions.retry(['file-id']);
// 重试所有失败的上传
actions.retry();
支持分块上传吗?
支持!使用 createChunkedUploader:
import { createChunkedUploader } from '@samithahansaka/dropup';
useDropup({
upload: createChunkedUploader({
url: '/api/upload/chunk',
chunkSize: 5 * 1024 * 1024, // 5MB
}),
});
可以直接上传到 S3 吗?
可以!使用云上传器:
import { createS3Uploader } from '@samithahansaka/dropup/cloud/s3';
useDropup({
upload: createS3Uploader({
getPresignedUrl: async (file) => {
const res = await fetch('/api/s3/presign', {
method: 'POST',
body: JSON.stringify({ filename: file.name }),
});
return res.json();
},
}),
});
验证
如何限制文件类型?
// 按 MIME 类型
useDropup({ accept: 'image/*' });
// 按扩展名
useDropup({ accept: '.pdf, .doc' });
// 多种类型
useDropup({ accept: ['image/*', 'application/pdf'] });
如何设置大小限制?
useDropup({
maxSize: 10 * 1024 * 1024, // 最大 10MB
minSize: 1024, // 最小 1KB
});
如何限制文件数量?
useDropup({
maxFiles: 5,
});
可以添加自定义验证吗?
可以!使用 customRules:
useDropup({
customRules: [
(file) => {
if (file.name.includes('draft')) {
return '不允许草稿文件';
}
return true;
},
],
});
预览
如何显示图片预览?
预览默认启用:
const { files } = useDropup();
{files.map(file => (
file.preview && <img src={file.preview} alt="" />
))}
需要清理预览 URL 吗?
不需要!Dropup 会在文件被移除或组件卸载时自动撤销 Object URL。
可以禁用预览吗?
useDropup({ generatePreviews: false });
故障排除
文件没有上传
-
检查
upload是否已配置:useDropup({ upload: { url: '/api/upload' } }); -
确保调用了
actions.upload()(除非设置了autoUpload: true) -
检查浏览器控制台的网络错误
预览 URL 不工作
- 确保文件是图片
- 检查
generatePreviews没有设置为false - 验证文件对象有有效的
preview属性
拖放不工作
- 确保在容器元素上展开了
getDropProps() - 包含隐藏的输入框:
<input {...getInputProps()} /> - 检查
disabled没有设置为true
TypeScript 错误
- 更新到最新版本的 Dropup
- 确保
tsconfig.json有正确的moduleResolution - 检查
@samithahansaka/dropup在dependencies中,而不是devDependencies
内存泄漏
- 确保使用
useDropup的组件正确卸载 - 如果需要,在卸载前调用
actions.reset() - 不要在没有清理的情况下将文件存储在外部状态中
兼容性
可以与 Next.js 一起使用吗?
可以!使用 'use client' 指令:
'use client';
import { useDropup } from '@samithahansaka/dropup';
可以与 React Native 一起使用吗?
可以!使用原生适配器:
import { NativeAdapter } from '@samithahansaka/dropup/native';
useDropup({ adapter: NativeAdapter });
支持 SSR 吗?
支持!Dropup 是 SSR 安全的。它只在浏览器 API 可用时才使用它们。
浏览器支持?
所有现代浏览器:
- Chrome 60+
- Firefox 55+
- Safari 12+
- Edge 79+
贡献
如何贡献?
- Fork 仓库
- 创建功能分支
- 提交 Pull Request
详情请参阅 CONTRIBUTING.md。
如何报告 bug?
在 github.com/samithahansaka/dropup/issues 提交 issue。
有路线图吗?
请查看 GitHub issues 和 discussions 了解计划中的功能。