WebUploader 是一个用于浏览器端文件上传的 JavaScript 库,它支持分片上传、断点续传等功能,非常适合于大文件上传场景。要使用 WebUploader 将文件上传至 Minio 服务器,你需要结合后端服务生成的临时上传凭证。以下是一个简化的流程:
准备工作
-
安装并运行 Minio 服务器:确保你的 Minio 服务器已经在运行,并配置好了访问密钥和秘密密钥。
-
后端服务:需要一个后端服务来生成用于上传的临时凭证。这个服务通常会使用 Minio 的 SDK(例如 Java SDK)来生成一个预签名的URL,这个URL允许前端直接向Minio上传文件而无需暴露长期的访问密钥。
步骤概览
-
后端生成预签名URL:编写一个后端接口,该接口接收文件相关信息(如文件名、类型等),然后使用 Minio SDK 生成一个预签名的上传URL和相应的表单数据(如Policy, Key等)。
-
前端获取上传凭证:前端通过 AJAX 请求调用上述后端接口,获取到预签名的URL和表单数据。
-
配置 WebUploader:使用获取到的预签名URL和表单数据配置 WebUploader,进行文件上传。
后端示例(Java Spring Boot)
这里提供一个简化的Java后端示例,使用Spring Boot和Minio Java SDK生成预签名URL:
// 导入必要的包
import io.minio.MinioClient;
import io.minio.policy.PolicyType;
import io.minio.presigned.PostPolicy;
import io.minio.errors.MinioException;
// 假设你已经有了一个MinioClient实例和配置好的bucketName
@PostMapping("/getUploadUrl")
public ResponseEntity<Map<String, String>> getUploadUrl(@RequestParam String filename) {
try {
PostPolicy policy = new PostPolicy(bucketName, filename, ZonedDateTime.now().plusDays(1));
policy.setContentType("application/octet-stream"); // 根据实际情况设置
policy.setExpires(Instant.now().plus(Duration.ofDays(1)));
Map<String, String> formData = policy.formData();
String uploadUrl = minioClient.presignedPostPolicy(policy);
Map<String, String> response = new HashMap<>();
response.put("url", uploadUrl);
response.putAll(formData);
return ResponseEntity.ok(response);
} catch (Exception e) {
// 处理异常
}
}
前端示例(使用 WebUploader)
前端部分,你需要配置 WebUploader 来使用从后端获取的预签名URL和表单数据进行文件上传:
// 引入 WebUploader
var uploader = WebUploader.create({
auto: true,
swf: '/path/to/Uploader.swf', // 如果需要使用Flash运行环境,请指定swf文件路径
server: '你的后端接口地址/getUploadUrl', // 这里先请求获取上传策略
pick: '#filePicker',
formData: {}, // 这里会在后端获取到预签名URL后填充
fileVal: 'file', // 文件字段名,根据后端要求调整
});
uploader.on('fileQueued', function(file) {
// 当文件被加入队列后触发,此时可以通过file.id获取文件ID
uploader.option('formData', {
// 填充后端返回的表单数据
key: file.name, // 上传后的文件名,通常由后端返回
policy: '从后端获取的policy值',
signature: '从后端获取的signature值',
// 其他可能需要的表单字段
});
});
uploader.on('uploadSuccess', function(file, response) {
console.log('文件上传成功', file, response);
});
请根据实际情况调整后端和前端的代码细节,特别是URL路径、表单字段名等。这个流程确保了前端能够安全地将文件直接上传至Minio服务器,同时也保持了后端对上传行为的控制和审计能力。