2017-10-10 3 views
0

J'essaie de télécharger une image vers AWS S3.Pourquoi amazon-aws-jdk 1.11.95 renvoie-t-il une exception Fichier non trouvé lors du téléchargement de l'image sur AWS S3?

L'application Web s'exécute dans mon bureau local sur le serveur Tomcat. Lorsque je télécharge l'image à partir du serveur, je vois les détails du fichier dans le fichier multipart http, je suis en mesure d'obtenir sa taille et les détails.

Voilà comment je configurer la connexion

File convFile = new File(file.getOriginalFilename()); 
      file.transferTo(convFile); 

AmazonS3 s3 = AmazonS3ClientBuilder.standard() 
       .withRegion(Regions.US_WEST_2) //regionName is a string for a region not supported by the SDK yet 
       .withCredentials(new AWSStaticCredentialsProvider 
        (new BasicAWSCredentials("key", "accessId"))) 
//    .setEndpointConfiguration(new EndpointConfiguration("https://s3.console.aws.amazon.com", "us-west-1")) 

       .enablePathStyleAccess() 
       .disableChunkedEncoding()     
       .build(); 
s3.putObject(new PutObjectRequest(bucketName, "key", convFile)); 

J'ai essayé deux méthodes.

1) Conversion de fichier en plusieurs parties à java.io.File et le téléchargement

Error: com.amazonaws.SdkClientException: Unable to calculate MD5 hash: MyImage.png (No such file or directory) 

2) Envoi de l'image comme bytestream

Error: I am getting java.io.FileNotFound Exception: /path/to/tomcat/MyImage.tmp not found 

Le nom de l'image réelle est MyImage.png.

Quelle que soit la méthode que j'essaie, je reçois une exception.

+0

Pourriez-vous pas utiliser simplement PutObject() avec un objet de fichier, comme indiqué à http://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpJava.html – jarmod

+0

@jarmod AmazonS3Client est désapprouvée dans le aws jdk mentionné. –

+0

Excuses pour la question évidente, mais le fichier local existe-t-il à l'emplacement indiqué et est-il lisible? Si vous supprimez le SDK AWS de l'image et essayez d'ouvrir le même fichier à partir d'une simple application Java, cela fonctionne-t-il? – jarmod

Répondre

0

Ok. Il y avait plusieurs problèmes.

  1. J'ai mal tapé la région pour un ensemble de clés différent.

Mais toujours les problèmes se produisaient et je suis retourné à la version 1.11.76. Et encore il y avait quelques problèmes et voici comment j'ai réparé.

  ObjectMetadata objectMetadata = new ObjectMetadata(); 
      objectMetadata.setContentType(file.getContentType()); 
      byte[] contentBytes = null; 
      try { 
       InputStream is = file.getInputStream(); 
       contentBytes = IOUtils.toByteArray(is); 
      } catch (IOException e) { 
       System.err.printf("Failed while reading bytes from %s", e.getMessage()); 
      } 

      Long contentLength = Long.valueOf(contentBytes.length); 
      objectMetadata.setContentLength(contentLength); 
      objectMetadata.setHeader("filename", fileNameWithExtn); 

      /* 
      * Reobtain the tmp uploaded file as input stream 
      */ 
      InputStream inputStream = file.getInputStream(); 

      File convFile = new File(fileNameWithExtn); //If i don't do //this, I think I was getting file not found or MD5 error. 
      file.transferTo(convFile); 

      FileUtils.copyInputStreamToFile(inputStream, convFile); //you //need to have commons.io in your pom.xml for this FileUtils to work. Not //the apache FileUtils. 
    AmazonS3 s3 = new AmazonS3Client(new AWSStaticCredentialsProvider 
        (new BasicAWSCredentials("<yourkeyId>", "<YourAccessKey>")));   
      s3.setRegion(Region.US_West.toAWSRegion()); 
      s3.setEndpoint("yourRegion.amazonaws.com"); 
      versionId = s3.putObject(new PutObjectRequest("YourBucketName", name, convFile)).getVersionId();