根据 Quarkus 文档,我无法成功连接到 s3,但我可以通过 AWS CLI 连接到 s3。你也会遇到这样的问题吗
我使用了 Quarkus 文档 尝试在我的 Quarkus 项目中使用 s3,但无论我做什么,错误都会告诉我该存储桶不存在,但我可以使用 AWS CLI 将文件上传到该存储桶。
这是我的资源:
@Path("/s3")
public class S3SyncClientResource extends CommonResource {
@Inject
S3Client s3;
@POST
@Path("upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(FormData formData) throws Exception {
if (formData.filename == null || formData.filename.isEmpty()) {
return Response.status(Status.BAD_REQUEST).build();
}
if (formData.mimetype == null || formData.mimetype.isEmpty()) {
return Response.status(Status.BAD_REQUEST).build();
}
PutObjectResponse putResponse = s3.putObject(buildPutRequest(formData),
RequestBody.fromFile(formData.data));
if (putResponse != null) {
return Response.ok().status(Status.CREATED).build();
} else {
return Response.serverError().build();
}
}
@GET
@Path("download/{objectKey}")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response downloadFile(String objectKey) {
ResponseBytes<GetObjectResponse> objectBytes = s3.getObjectAsBytes(buildGetRequest(objectKey));
ResponseBuilder response = Response.ok(objectBytes.asUtf8String());
response.header("Content-Disposition", "attachment;filename=" + objectKey);
response.header("Content-Type", objectBytes.response().contentType());
return response.build();
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<FileObject> listFiles() {
ListObjectsRequest listRequest = ListObjectsRequest.builder().bucket(bucketName).build();
//HEAD S3 objects to get metadata
return s3.listObjects(listRequest).contents().stream()
.map(FileObject::from)
.sorted(Comparator.comparing(FileObject::getObjectKey))
.collect(Collectors.toList());
}
}
abstract public class CommonResource {
@ConfigProperty(name = "bucket.name")
String bucketName;
protected PutObjectRequest buildPutRequest(FormData formData) {
return PutObjectRequest.builder()
.bucket(bucketName)
.key(formData.filename)
.contentType(formData.mimetype)
.build();
}
protected GetObjectRequest buildGetRequest(String objectKey) {
return GetObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
.build();
}
}
这是我的应用程序。属性:
quarkus.s3.aws.region=ap-northeast-2
quarkus.s3.aws.credentials.type=default
quarkus.s3.aws.credentials.type=default
这是我的pom.xml
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>url-connection-client</artifactId>
</dependency>
<dependency>
<groupId>io.quarkiverse.amazonservices</groupId>
<artifactId>quarkus-amazon-s3</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-reactive-jackson</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-arc</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-reactive</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>
我确信我配置了 .aws/credentials 并且我可以使用 aws cli 将我的文件上传到我的存储桶,但是当我尝试使用此上传 api 时,它会出现这个错误:
software.amazon.awssdk.services.s3.model.NoSuchBucketException: The specified bucket does not exist (Service: S3, Status Code: 404, Request ID: d436fe05-9929-434a-94ed-42e5f50c5a0f, Extended Request ID: s9lzHYrFp76ZVxRcpX9+5cjAnEH2ROuNkd2BHfIa6UkFVdtjf5mKR3/eTPFvsiP/XV/VLi31234=)
我确保这个桶存在!!
指南中没有详细记录,但您必须禁用开发服务。默认情况下,它设置为 true,因此它启动自己的本地 S3 服务:https://docs.quarkiverse.io/quarkus-amazon-services/2.12.x/amazon-s3.html#quarkus-amazon-s3_quarkus-启用 s3-devservices
确保在您的
application.properties
文件中设置此项
quarkus.s3.devservices.enabled=false