147 votes

Amazon S3 Modifier le nom de téléchargement du fichier

J'ai des fichiers stockés sur S3 avec un GUID comme nom de clé.

J'utilise une URL pré-signée pour le téléchargement comme suit API S3 REST

Je stocke le nom du fichier original dans ma propre base de données. Lorsqu'un utilisateur clique pour télécharger un fichier à partir de mon application web Je souhaite leur renvoyer leur nom de fichier original, mais actuellement, tout ce qu'ils obtiennent est un GUID. . Comment y parvenir ?

Mon application web est dans salesforce donc je n'ai pas beaucoup de contrôle pour faire des response.redirects tous télécharger le fichier sur le serveur web puis le renommer à cause des limitations du gouverneur.

Existe-t-il une redirection HTML, un meta refresh, un Javascript que je puisse utiliser ? Existe-t-il un moyen de changer le nom du fichier de téléchargement pour S3 (la seule chose à laquelle je pense est de copier l'objet sous un nouveau nom, de le télécharger, puis de le supprimer).

Je veux éviter de créer un bac par utilisateur car nous aurons beaucoup d'utilisateurs et il n'y a toujours pas de garantie que chaque fichier dans chaque bac aura un nom unique.

D'autres solutions ?

110voto

cloudberryman Points 1760

Je suppose que vous avez transféré cette question à Forum Amazon S3 mais pour le bien des autres, j'aimerais afficher la réponse ici :

S'il n'y a jamais qu'un seul "nom de fichier utilisateur" pour chaque objet S3, vous pouvez définir l'en-tête Content-Disposition de votre fichier s3 pour définir le nom de fichier de téléchargement :

Content-Disposition: attachment; filename="foo.bar"

Par souci d'équité, j'aimerais préciser que ce n'est pas moi qui ai fourni la bonne réponse sur le forum Amazon et que tout le mérite en revient à Colin Rhodes ;-)

87voto

Pawel Points 1507

Bien que la réponse acceptée soit correcte, je la trouve très abstraite et difficile à utiliser.

Voici un bout de code node.js qui résout le problème énoncé. Je conseille de l'exécuter en tant que AWS Lambda pour générer des Url pré-signées.

var AWS = require('aws-sdk');
var s3 = new AWS.S3({
    signatureVersion: 'v4'
});
const s3Url = process.env.BUCKET;

module.exports.main = (event, context, callback) => {
var s3key = event.s3key
var originalFilename = event.originalFilename

var url = s3.getSignedUrl('getObject', {
        Bucket: s3Url,
        Key: s3key,
        Expires: 600,
        ResponseContentDisposition: 'attachment; filename ="' + originalFilename + '"'
    });

[... rest of Lambda stuff...]

}

Veuillez prendre note de ce qui suit ResponseContentDisposition attribut de params passé dans l'objet s3.getSignedUrl fonction.

Pour plus d'informations, voir la documentation sur la fonction getObject à l'adresse suivante http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property

29voto

Uriah Carpenter Points 3704

Au début du mois de janvier 2011, S3 a ajouté la possibilité de modifier l'en-tête de la requête. Cette fonctionnalité vous permet de modifier "dynamiquement" l'en-tête Content-Disposition pour des demandes individuelles.

Voir le S3 documentation sur l'obtention d'objets pour plus de détails.

9voto

hkutluay Points 3248

Avec C# en utilisant AWSSDK,

GetPreSignedUrlRequest request = new GetPreSignedUrlRequest
{
    BucketName = BucketName,
    Key = Key,
    Expires = DateTime.Now.AddMinutes(25) 
};

request.ResponseHeaderOverrides.ContentDisposition = $"attachment; filename={FileName}";

var url = s3Client.GetPreSignedURL(request);

4voto

Abhishek Basak Points 101

Pour le SDK Java AWS, l'extrait de code ci-dessous devrait faire l'affaire :

GeneratePresignedUrlRequest generatePresignedUrlRequest = 
                new GeneratePresignedUrlRequest(s3Bucket, objectKey)
                .withMethod(HttpMethod.GET)
                .withExpiration(getExpiration());

ResponseHeaderOverrides responseHeaders = new ResponseHeaderOverrides();
responseHeaders.setContentDisposition("attachment; filename =\"" + fileName + "\"");

generatePresignedUrlRequest.setResponseHeaders(responseHeaders);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X