web-dev-qa-db-fra.com

AWS Java S3 Erreur de téléchargement: "le fichier de profil ne peut pas être nul"

Je reçois une exception lorsque j'essaie de télécharger un fichier sur Amazon S3 à partir de mon Java Spring. La méthode est assez simple:

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();
        }
    }

C'est fondamentalement la même chose qu'Amazon fournit ici , et la même exception avec exactement le même message ("le fichier de profil ne peut pas être nul") apparaît lors de la tentative cette autre version. Le problème n'est pas lié au fichier inexistant ou nul (j'ai déjà vérifié de mille façons que l'argument File reçu par TransferManager.upload existe avant de l'appeler).

Je ne trouve aucune information sur mon message d'exception " le fichier de profil ne peut pas être nul ". Les premières lignes du journal des erreurs sont les suivantes:

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)

Ma politique S3 permet d'obtenir et de mettre des objets pour tous les types d'utilisateurs.

Une idée de ce qui se passe?

14
Pablo

ProfileCredentialsProvider () crée un nouveau fournisseur d'informations d'identification de profil qui renvoie les informations d'identification de sécurité AWS configurées pour le profil par défaut.

Donc, si vous n'avez aucune configuration pour le profil par défaut à ~/.aws/credentials, en essayant de mettre un objet, il renvoie cette erreur.

Si vous exécutez votre code sur le service Lambda, il ne fournira pas ce fichier. Dans ce cas, vous n'avez pas non plus besoin de fournir d'informations d'identification. Attribuez simplement le rôle IAM approprié à votre fonction lambda, puis l'utilisation du constructeur par défaut devrait résoudre le problème.

Vous voudrez peut-être changer le constructeur TransferManager selon vos besoins.

17
emre can

La solution était assez simple: j'essayais d'implémenter cette communication sans bean AmazonS3 pour Spring.

Ce lien vous aidera avec la configuration:

http://codeomitted.com/upload-file-to-s3-with-spring/

4
Pablo

mon code a bien fonctionné comme ci-dessous:

AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(DefaultAWSCredentialsProviderChain.getInstance()).withRegion(clientRegion).build();
0
m.nguyencntt