2016-11-30 50 views
7

Otrzymuję wyjątek podczas próby przesłania pliku do Amazon S3 z mojej aplikacji Java Spring. Metoda jest bardzo prosta:AWS Java S3 Błąd przesyłania: "plik profilu nie może być pusty"

private void productionFileSaver(String keyName, File f) throws InterruptedException { 

     String bucketName = "{my-bucket-name}"; 
     TransferManager tm = new TransferManager(new ProfileCredentialsProvider());   
     // TransferManager processes all transfers asynchronously, 
     // so this call will return immediately. 
     Upload upload = tm.upload(
       bucketName, keyName, new File("/mypath/myfile.png")); 

     try { 
      // Or you can block and wait for the upload to finish 
      upload.waitForCompletion(); 
      System.out.println("Upload complete."); 
     } catch (AmazonClientException amazonClientException) { 
      System.out.println("Unable to upload file, upload was aborted."); 
      amazonClientException.printStackTrace(); 
     } 
    } 

To jest w zasadzie to samo, że Amazon udostępnia here, a tym samym wyjątek z dokładnie tej samej wiadomości („plik profilu nie może być null”) pojawia się podczas próby this other wersję. Problem nie jest związany z plikiem nieistniejącym lub będącym zerowym (sprawdziłem już tysiące sposobów, że argument Plik został odebrany przez metodę TransferManager.upload przed wywołaniem).

Nie mogę znaleźć żadnych informacji na temat mojego komunikatu o wyjątku "plik profilu nie może mieć wartości null". Pierwsze wiersze protokołu błędów są następujące:

com.amazonaws.AmazonClientException: Unable to complete transfer: profile file cannot be null 
    at com.amazonaws.services.s3.transfer.internal.AbstractTransfer.unwrapExecutionException(AbstractTransfer.java:281) 
    at com.amazonaws.services.s3.transfer.internal.AbstractTransfer.rethrowExecutionException(AbstractTransfer.java:265) 
    at com.amazonaws.services.s3.transfer.internal.AbstractTransfer.waitForCompletion(AbstractTransfer.java:103) 
    at com.fullteaching.backend.file.FileController.productionFileSaver(FileController.java:371) 
    at com.fullteaching.backend.file.FileController.handlePictureUpload(FileController.java:247) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 

Moja polityka S3 umożliwia pobieranie i umieszczanie obiektów dla wszystkich rodzajów użytkowników.

Masz pojęcie o tym, co się dzieje?

Odpowiedz

9

ProfileCredentialsProvider() creates a new profile credentials provider that returns the AWS security credentials configured for the default profile.

Tak więc, jeśli nie mają żadnego konfigurację domyślnego profilu w ~/.aws/credentials, starając się umieścić przedmiot, to daje ten błąd.

Jeśli uruchomisz swój kod w serwisie Lambda, nie dostarczy tego pliku. W takim przypadku nie musisz również podawać referencji. Po prostu przypisz prawą funkcję IAM do swojej funkcji lambda, a następnie użyj domyślnego konstruktora, aby rozwiązać problem.

Możesz chcieć zmienić konstruktora TransferManager w zależności od potrzeb.

+1

Dzięki. To samo w 'Lambda', przekazywałem' ProfileCredentialsProvider' do konstruktora, który powoduje ten błąd. Używanie 'AmazonS3 s3Client = new AmazonS3Client();' działa. –

+1

FYI - Miałem ten problem w pojemniku ECS w doku. To samo, co w przypadku Lambdy. Zajrzyj do kodu dla 'new ProfileCredentialsProvider (someProfile)) i zastąp go' DefaultAWSCredentialsProviderChain.getInstance() ' –

+0

Zostawiłem odpowiedź z przykładami kodu tutaj: http://stackoverflow.com/questions/41796355/aws-error- pobieranie-object-from-s3-profile-file-can-null-by-null/44079772 # 44079772 –