2010-04-09 20 views
52

Tengo archivos almacenados en S3 con un GUID como nombre de clave.Nombre de cambio de archivo de cambio de Amazon S3

estoy usando una URL previamente firmado para descargar según S3 REST API

almaceno el nombre del archivo original en mi propia base de datos. Cuando un usuario hace clic para descargar un archivo desde mi aplicación web , quiero devolver su nombre de archivo original, pero actualmente todo lo que obtienen es un GUID. ¿Cómo puedo conseguir esto?

Mi aplicación web está en Salesforce, así que no tengo mucho control para hacer response.redirects todos descargan el archivo al servidor web y luego lo renombran debido a limitaciones del gobernador.

¿Hay algún redireccionamiento de HTML, actualización de meta, Javascript que pueda usar? ¿Hay alguna forma de cambiar el nombre del archivo de descarga para S3 (lo único que se me ocurre es hacer frente al objeto con un nuevo nombre, descargarlo y luego eliminarlo).

que quieren evitar la creación de un cubo por usuario, ya que tendremos una gran cantidad de usuarios y todavía no hay garantía en cada archivo con cada cubo tendrá un nombre único

Cualesquiera otras soluciones?

+3

Otra fiar modo que también está cerrado como fuera de tema! Las preguntas y respuestas también tienen más votos que la gran mayoría de las preguntas/respuestas habituales ... – DeepSpace101

+0

Sí, obviamente es más importante que tratemos de organizar las cosas de forma un tanto arbitraria ante el hecho de que no está garantizado que tenga sentido en el futuro o incluso ahora. ¿Qué pasó cuando la gente se divirtió al hacer y responder preguntas relacionadas con la industria del software? ¿Quién realmente encuentra la respuesta debido a esta organización? ¿Quién encuentra una estructura organizativa en el software consistente y claramente definida en toda la industria?Sin esta definición clara que durará una cantidad significativa de tiempo organizándolo es una pérdida de tiempo bastante estúpida ... –

+0

Encuentro esta respuesta, no tengo ningún problema con esta organización. –

Respuesta

59

pienso que su cruz ha publicado esto preguntas a Amazon S3 forum, pero por el bien de los demás me gustaría publicar la respuesta aquí:

Si hay solo un "nombre de usuario" para cada objeto S3, luego puede configurar el encabezado Content-Disposition en su archivo s3 para establecer el nombre de archivo de descarga: Content-Disposition: attachment; archivo = foo.bar

En aras de la imparcialidad que me gustaría mencionar que no era yo para proporcionar la respuesta correcta en el foro Amazonas y todos los créditos debe ir a Colin Rodas ;-)

+0

sí, gracias por recordarme. La otra pieza de información vital es cuando se agrega Content-Disposition, es sensible a mayúsculas y NO es necesario en el prefijo x-amz. – Daveo

+2

Eche un vistazo a la respuesta a continuación, desde enero de 2011 también es posible por solicitud GET. Por lo tanto, es posible tener tantos "nombres de archivo de usuario" como desee. – fabi

+2

Necesitaba agregar comillas al nombre del archivo para que esto funcione, por lo que mi encabezado era: Content-Disposition: attachment; filename = "foo.bar" – nathancahill

18

En A principios de enero de 2011 S3 agregó reemplazos de encabezado de solicitud. Esta funcionalidad le permite 'dinámicamente' alterar el encabezado de la disposición del contenido para solicitudes individuales.

Consulte el S3 documentation on getting objects para obtener más información.

5

Si bien la respuesta aceptada es correcta, me parece muy abstracta y difícil de utilizar.

Aquí hay un fragmento del código node.js que resuelve el problema planteado. Aconsejo ejecutarlo como AWS Lambda para generar Url pre-firmado.

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

} 

Por favor, tome nota de ResponseContentDisposition atributo del objeto pasado en paramss3.getSignedUrl función.

Más información en virtud de la función getObject doc en http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property