Как исправить ошибку 401 Unauthorized при использовании AWS SDK с хранилищем Cloudflare R2 в примере Spring Boot?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как исправить ошибку 401 Unauthorized при использовании AWS SDK с хранилищем Cloudflare R2 в примере Spring Boot?

Сообщение Anonymous »

У меня возникла проблема с устранением проблемы 401 Unauthorized при загрузке файла через Cloudflare R2 Storage в примере Spring Boot.
Я получаю значение токена, ключ доступа, секретный ключ и конечные точки для конкретной юрисдикции для клиентов S3 из токенов API учетной записи хранилища R2.
Имя сегмента сохраняется. в Восточной Европе (EEUR)
Вот зависимости, определенные в pom.xml:

Код: Выделить всё

    
software.amazon.awssdk
s3
${cloudflare-aws-sdk-version}
compile




software.amazon.awssdk
apache-client
${cloudflare-aws-sdk-version}




org.apache.httpcomponents
httpclient
${apache-httpclient.version}

Вот файл application.yml:

Код: Выделить всё

cloudflare:
r2:
endpoint: https://.r2.cloudflarestorage.com
accessKey: access-key
secretKey: secret-key
bucket: buckey-name
Вот класс CloudflareProperties:

Код: Выделить всё

@Getter
@Setter
@ConfigurationProperties(prefix = "cloudflare.r2")
public class CloudflareProperties {
private String endpoint;
private String accessKey;
private String secretKey;
}
Это класс CloudflareR2Config:

Код: Выделить всё

@Configuration
@EnableConfigurationProperties(CloudflareProperties.class)
@RequiredArgsConstructor
public class CloudflareR2Config {

private final CloudflareProperties cloudflareProperties;

@Bean
public S3Client s3Client() {

return S3Client.builder()
.httpClientBuilder(ApacheHttpClient.builder())
.region(Region.of("eeur"))
.endpointOverride(URI.create(cloudflareProperties.getEndpoint()))
.credentialsProvider(StaticCredentialsProvider.create(
AwsBasicCredentials.create(
cloudflareProperties.getAccessKey(),
cloudflareProperties.getSecretKey())))
.serviceConfiguration(S3Configuration.builder().pathStyleAccessEnabled(true).build())
.build();
}

}
А это класс обслуживания:

Код: Выделить всё

@Service
@RequiredArgsConstructor
public class MediaService {

private final S3Client s3Client;

@Value("${cloudflare.r2.bucket}")
private String bucket;

public String uploadFile(MultipartFile file) {

String originalFilename = Optional.ofNullable(file.getOriginalFilename())
.orElseThrow(() -> new UnsupportedMediaTypeException("Filename is missing"))
.toLowerCase();

String contentType = Optional.ofNullable(file.getContentType())
.orElseThrow(() -> new UnsupportedMediaTypeException("Content-Type is unknown"));

String folder = switch (getFileExtension(originalFilename)) {
case "jpg", "jpeg", "png" -> "images";
case "mp4", "mov" -> "videos";
default -> throw new UnsupportedMediaTypeException("Unsupported file type: " + contentType);
};

String key = folder + "/" + UUID.randomUUID() + "-" + originalFilename;

PutObjectRequest putRequest = PutObjectRequest.builder()
.bucket(bucket)
.key(key)
.contentType(contentType)
.build();

try {
s3Client.putObject(putRequest, RequestBody.fromBytes(file.getBytes()));
} catch (IOException e) {
throw new FileUploadException("File upload to Cloudflare R2 failed", e);
}

return key;
}

private String getFileExtension(String filename) {
int lastDot = filename.lastIndexOf('.');
if (lastDot == -1 || lastDot == filename.length() - 1) {
throw new IllegalArgumentException("Invalid file extension in filename: "  + filename);
}
return filename.substring(lastDot + 1);
}
}
Это класс контроллера:

Код: Выделить всё

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/media")
public class MediaController {

private final MediaService mediaService;

@PostMapping("/upload")
public ResponseEntity uploadImage(@RequestParam("file") MultipartFile file) {

String key = mediaService.uploadFile(file);
return ResponseEntity.ok(key);
}
}
Когда я отправляю запрос на localhost:7777/api/media/upload, я получаю следующую ошибку:

Код: Выделить всё

{
"error": "Internal Server Error",
"message": "Unauthorized (Service: S3, Status Code: 401, Request ID: null) (SDK Attempt Count: 1)"
}
Как устранить проблему?

Подробнее здесь: https://stackoverflow.com/questions/796 ... storage-in
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»