2010-04-09 24 views
52

I file sono memorizzati su S3 con un GUID come nome chiave.Amazon S3 Modifica nome file download

Sto usando un URL pre firmato per scaricare secondo S3 REST API

devo conservare il nome del file originale nel mio database. Quando un utente fa clic per scaricare un file dalla mia applicazione Web , voglio restituire il nome del file originale, ma attualmente tutto ciò che ottengono è un GUID. Come posso raggiungere questo obiettivo?

La mia app Web è in vendita, quindi non ho molto controllo su response.redirect per scaricare il file sul server Web, quindi rinominarlo in base ai limiti del governor.

C'è qualche reindirizzamento HTML, meta refresh, Javascript che posso usare? C'è un modo per cambiare il nome del file di download per S3 (l'unica cosa che posso pensare è copiare l'oggetto con un nuovo nome, scaricarlo e cancellarlo).

voglio evitare di creare un secchio per utente, come avremo un sacco di utenti e ancora alcuna garanzia ogni file con in ciascun segmento avrà un nome univoco

Eventuali altre soluzioni?

+3

Un'altra legit SO domanda che chiuso fuori tema! Anche la domanda e le risposte hanno più voti di una grande maggioranza di solite domande/risposte ... – DeepSpace101

+0

Sì, è ovviamente più importante che cerchiamo di organizzare le cose in modo un po 'arbitrario di fronte al fatto che non è garantito che abbia senso in futuro o anche ora. Cosa è successo quando le persone si sono semplicemente divertite a chiedere e rispondere a domande relative all'industria del software? Chi trova effettivamente la risposta a causa di questa organizzazione? Chi trova la struttura organizzativa del software coerente e chiaramente definita in tutto il settore?Senza questa chiara definizione che durerà una quantità significativa di tempo organizzarla è una perdita di tempo abbastanza stupida ... –

+0

Trovo questa risposta, non ho alcun problema con questa organizzazione. –

risposta

59

penso che la croce ha postato questa domanda a Amazon S3 forum, ma per il bene degli altri mi piacerebbe inviare la risposta qui:

Se v'è sempre e solo un "nome utente" per ogni oggetto S3, quindi è possibile impostare l'intestazione Content-Disposition sul file s3 per impostare il nome file scaricato: Content-Disposition: attachment; filename = foo.bar

Per motivi di equità mi piacerebbe parlare del fatto che non sono stato io a fornire la risposta giusta su Amazon forum e tutti i crediti dovrebbe andare a Colin Rodi ;-)

+0

sì grazie per avermelo ricordato. L'altra parte delle informazioni vitali è quando si aggiunge Content-Disposition è sensibile alle maiuscole e minuscole e NON ha bisogno del prefisso x-amz. – Daveo

+2

Dai un'occhiata alla risposta qui sotto, dal gennaio 2011 è anche possibile su una base di richieste GET. Quindi è possibile avere tanti "nomi di file utente" quanti ne vuoi. – fabi

+2

Avevo bisogno di aggiungere virgolette al nome del file per farlo funzionare, quindi il mio header era: Content-Disposition: attachment; filename = "foo.bar" – nathancahill

18

In All'inizio di gennaio 2011 S3 ha aggiunto l'override dell'intestazione della richiesta. Questa funzionalità consente di modificare "dinamicamente" l'intestazione Content-Disposition per singole richieste.

Vedere S3 documentation on getting objects per ulteriori dettagli.

5

Mentre la risposta accettata è corretta, la trovo molto astratta e difficile da utilizzare.

Ecco un pezzo di codice node.js che risolve il problema indicato. Consiglio di eseguirlo come AWS Lambda per generare Url pre-firmati.

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...] 

} 

Si prega di tenere nota delle ResponseContentDisposition attributo params oggetto passato in s3.getSignedUrl funzione.

Maggiori informazioni in funzione getObject doc presso http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property