es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Sube la imagen a Amazon S3 utilizando @aws-sdk/client-s3 y obtén su ubicación.

Estoy intentando cargar un archivo de imagen en S3, pero obtengo este error que dice:

ERROR: MethodNotAllowed: El método especificado no está permitido para este recurso.

Mi código utiliza el paquete @aws-sdk/client-s3 para cargarlo con este código:

const s3 = new S3({
    region: 'us-east-1',
    credentials: {
        accessKeyId: config.accessKeyId,
        secretAccessKey: config.secretAccessKey,
    }
});

exports.uploadFile = async options => {
    options.internalPath = options.internalPath || (`${config.s3.internalPath + options.moduleName}/`);
    options.ACL = options.ACL || 'public-read';

    logger.info(`Cargando [${options.path}]`);
    const params = {
        Bucket: config.s3.bucket,
        Body: fs.createReadStream(options.path),
        Key: options.internalPath + options.fileName,
        ACL: options.ACL
    };

    try {
        const s3Response = await s3.completeMultipartUpload(params);
        if (s3Response) {
            logger.info(`Carga completa, cargado en: ${s3Response.Location}`);
            return { url: s3Response.Location };
        }
    } catch (err) {
        logger.error(err, 'No se pudo cargar:');
        throw err;
    }
};

No estoy seguro de lo que significa este error y una vez que se haya cargado el archivo, necesito obtener su ubicación en S3

Gracias por cualquier ayuda

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El error “MethodNotAllowed: El método especificado no está permitido en este recurso” indica que el método HTTP especificado (como PUT o POST) no está permitido en el bucket de S3 o en el objeto al que estás intentando subir.

    En tu código, estás usando el método completeMultipartUpload del cliente de S3 para subir el archivo. Este método se utiliza para completar una carga multipartes (es decir, cuando subes un archivo grande en partes) y no se puede utilizar para subir un solo archivo.

    Para subir un solo archivo, puedes utilizar en su lugar el método putObject. Tu código debería verse algo así:

    const s3 = new S3({
      region: 'us-east-1',
      credentials: {
        accessKeyId: config.accessKeyId,
        secretAccessKey: config.secretAccessKey,
      },
    });
    
    exports.uploadFile = async (options) => {
      options.internalPath =
        options.internalPath ||
        `${config.s3.internalPath + options.moduleName}/`;
      options.ACL = options.ACL || 'public-read';
    
      logger.info(`Subiendo [${options.path}]`);
      const params = {
        Bucket: config.s3.bucket,
        Body: fs.createReadStream(options.path),
        Key: options.internalPath + options.fileName,
        ACL: options.ACL,
      };
    
      try {
        const s3Response = await s3.putObject(params).promise();
        if (s3Response) {
          logger.info(`¡Subida completada, subido a: ${s3Response.Location}`);
          return { url: s3Response.Location };
        }
      } catch (err) {
        logger.error(err, 'no se pudo subir:');
        throw err;
      }
    };
    

    Una vez que el archivo se haya subido utilizando el método putObject, puedes obtener su ubicación (es decir, URL) accediendo a la propiedad Location del objeto de respuesta.

    ¡Espero que esto te ayude! Avísame si tienes alguna pregunta adicional.

Comments are closed.