Estoy tratando de implementar la carga de archivos en una aplicación web Java. Cuando el usuario carga un archivo a través de la interfaz de usuario, quiero que se almacene en el almacenamiento de amazon amazon s3.
Aquí está mi código para el back-end:
@PostMapping("/upload-file") public String saveFile(@RequestParam("name") String name, @RequestParam("file")MultipartFile file, RedirectAttributes redirectAttributes){ AWSCredentials credentials = new BasicAWSCredentials("user", "psw"); AmazonS3 s3Client = new AmazonS3Client(credentials); String bucketName = "kfib"; s3Client.createBucket(bucketName); s3Client.setRegion(com.amazonaws.regions.Region.getRegion(Regions.EU_WEST_1)); ObjectMetadata md = new ObjectMetadata(); md.setContentType("application/pdf");// md.set
try{ InputStream inputStream = file.getInputStream(); s3Client.putObject(new PutObjectRequest(bucketName, name, inputStream, md).withCannedAcl(CannedAccessControlList.PublicRead)); S3Object s3Object = s3Client.getObject(new GetObjectRequest(bucketName, name)); log.info("Url of the image:\n"); log.info(s3Object.getObjectContent().getHttpRequest().getURI().toString()); }catch(IOException e){ e.printStackTrace(); } log.info("upload called with post method..."); return "redirect:/admin/posts"; }Puedo subir archivos si los subo a la región predeterminada. Sin embargo, deseo almacenar mis archivos en otro servidor. Tengo un depósito en una región de la UE, si trato de cargar algo allí con el código anterior, obtengo el siguiente código de error:
com.amazonaws.services.s3.model.AmazonS3Exception: The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'eu-central-1' (Service: Amazon S3; Status Code: 400; Error Code: AuthorizationHeaderMalformed; Request ID: 8EF630B5F0224C4F)Parece esta línea
s3Client.setRegion(com.amazonaws.regions.Region.getRegion(Regions.EU_WEST_1));no tiene ningún efecto. ¿Qué estoy haciendo mal?
Estaba enfrentando el mismo problema, pero lo siguiente funcionó para mí:
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_1).build();Para el acceso al depósito global
puede establecer el indicador withForceGlobalBucketAccessEnabled en verdadero
me gusta
AmazonS3 s3client = AmazonS3ClientBuilder .standard() .withCredentials(new AWSStaticCredentialsProvider(credentials)) .withForceGlobalBucketAccessEnabled(true) .build();