使用Minio S3创建Bucket并上传JPG文件后无法打开文件
问题原因分析
- 代码中两次调用
putObject上传同一个Resume.jpg对象,第二次上传会直接覆盖第一次的内容。 - 第二次上传时,
stream()方法的第二个参数错误设置为1L——这个参数代表文件的实际字节大小,硬写1L会导致Minio仅读取1字节的文件内容,上传后的文件不完整,因此无法正常打开。 - 另外,
stream.available()不能保证获取到文件的完整长度,对于大文件可能出现长度计算错误的情况。
修正后的代码
public void saveTest() { try { MinioClient minioClient = MinioClient.builder() .endpoint("http://localhost:9099") .credentials("minioadmin", "minioadmin") .build(); boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket("test").build()); if (!found) { minioClient.makeBucket(MakeBucketArgs.builder().bucket("test").build()); } else { System.out.println("Bucket 'test' already exists."); } File imageFile = new File("C:\\path\\picture.jpg"); // 使用正确的文件大小和类型上传 minioClient.putObject(PutObjectArgs.builder() .bucket("test") .object("Resume.jpg") .stream(new FileInputStream(imageFile), imageFile.length(), 5L * 1024 * 1024) .contentType("image/jpeg") // 明确指定图片类型,提升兼容性 .build()); System.out.println("文件上传完成"); } catch (MinioException | IOException | NoSuchAlgorithmException | InvalidKeyException e) { System.out.println("Error occurred: " + e.getMessage()); e.printStackTrace(); } }
关键修复说明
- 删除重复的
putObject调用,避免文件被错误覆盖。 - 用
imageFile.length()获取文件真实字节数,替代硬编码的1L,确保上传完整的文件内容。 - 添加
contentType("image/jpeg")指定文件MIME类型,帮助Minio和后续访问的客户端正确识别文件格式。 - 使用
File对象管理目标文件,更可靠地获取文件信息。
内容的提问来源于stack exchange,提问作者Maleficent
相关产品推荐
相关产品推荐

