在使用 MinIO 進行文件上傳時,我遇到了一個比較坑的問題。錯誤日志如下:
io.minio.errors.InvalidResponseException: Non-XML response from server. Response code: 400, Content-Type: text/xml; charset=utf-8, body: <?xml version="1.0" encoding="UTF-8"?><Error><Code>InvalidArgument</Code><Message>S3 API Requests must be made to API port.</Message><RequestId>0</RequestId></Error>at io.minio.S3Base.execute(S3Base.java:577)at io.minio.S3Base.getRegion(S3Base.java:691)at io.minio.S3Base.execute(S3Base.java:464)at io.minio.S3Base.executeHead(S3Base.java:725)at io.minio.MinioClient.bucketExists(MinioClient.java:1135)at com.sky.service.impl.FileServiceImpl.upload(FileServiceImpl.java:31)at com.sky.controller.admin.FileUploadController.upload(FileUploadController.java:31)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
問題原因
S3 API 請求必須發送到 API 端口,而不是其他端口
在 MinIO 中有兩類端口:
-
API 端口:用于 S3 協議的文件上傳下載
-
Console(Web UI)端口:用于瀏覽器訪問管理界面
如果在代碼中配置了 Console 端口,MinIO 會直接拒絕請求,并返回這個錯誤
我的錯誤配置
檢查項目的配置文件 application.yml
,發現我寫的是 9000
端口:
minio: endpoint: http://127.0.0.1:9000 access-key: root secret-key: 12345678 bucket-name: lease
而 9000
其實是 Web 控制臺端口,不是 API 端口:
查找的正確端口
打開運行 MinIO 的終端,可以看到啟動信息里明確寫了 API 和 WebUI 的端口:
可以看到:
-
API 端口是
9005
-
WebUI 端口是
9000
解決方案
將 application.yml
中的端口改成 API 端口即可:
minio: endpoint: http://127.0.0.1:9005 access-key: root secret-key: 12345678 bucket-name: lease
修改配置后重新運行項目,文件上傳成功 ?: