Estoy lidiando con el problema inevitable de que los usuarios puedan sobrescribir archivos en mi depósito a través de una carga de JavaScript S3.
Después de cargar un archivo, suponiendo que tengo el control de versiones habilitado, ¿hay alguna forma de obtener el ID de la versión original para poder almacenarlo en mi base de datos para recuperarlo más tarde cuando visualice ese archivo?
Este es mi código de carga actual:
s3.upload(params).on('httpUploadProgress', function(evt) { var uploaded = Math.round(evt.loaded / evt.total * 100); console.log(`File uploaded: ${uploaded}%`); }).send(function(err, data) { if(err){ alert(err); } else { alert('File is uploaded successfully!'); console.log(data); } });
No veo ningún ID de versión en la respuesta de datos, ya que parece estar en los encabezados de respuesta. Hay alguna forma de sacarlo de ahi?
Estás bien; su código no tiene acceso a la versión anterior/original versionId.
No conozco sus requisitos exactos, pero veo dos formas de hacerlo:
Verifique los metadatos del archivo antes de upload
con s3.headObject que devuelve data.VersionId
. Si el archivo no existe, no importa; de lo contrario, puede guardar el ID de la versión original en la base de datos.
No guarde las versiones en la base de datos y búsquelas con listObjectVersions cuando el archivo se muestre desde S3.
Pude recuperar la ID de la versión original inmediatamente después de la carga usando el siguiente código (carga la imagen y luego toma la versión justo después de usar listObjectVersions):
s3.upload(params).on('httpUploadProgress', function(evt) { var uploaded = Math.round(evt.loaded / evt.total * 100); console.log(`File uploaded: ${uploaded}%`); }).send(function(err, data) { if(err){ alert(err); } else { alert('File is uploaded successfully!'); console.log(data); var params = { Bucket: "mybucket", Prefix: "images/path-to-image.jpg" }; s3.listObjectVersions(params, function(err, data) { var versionId = data["Versions"][0]["VersionId"]; alert(versionId); }); } });
Asegúrese de tener habilitadas las versiones de objetos de lista en su política de depósito:
{ "Sid": "Statement2", "Effect": "Allow", "Principal": "*", "Action": "s3:ListBucketVersions", "Resource": "arn:aws:s3:::mybucket" }