La carga de imágenes en s3 no se procesa
Avatar dhj
Pregunta contestada

La carga de imágenes en s3 no se procesa

Utilizo Expo Image Picker para enviar una imagen recortada a s3. El archivo se está cargando, pero no se representa como una imagen porque no se reconoce como tal. Si tomo los datos del blob y los uso en un codificador de imagen base64, obtengo la imagen, por lo que debe estar basada en mimo o codificación, esto es lo que tengo.

Invoco el Expo Image Picker con;

let pickerResult = await ImagePicker.launchImageLibraryAsync({
  allowsEditing: true,
  aspect: [1, 1],
  base64: true,
  exif: false,
});

Los parámetros que utilizo para crear la URL firmada desde el SDK de s3 son;

const params = {
    Bucket: 'images,
    Key: 'filename.jpg',
    Expires: 60 * 5,
    ACL: 'public-read',
    ContentEncoding: 'base64',
    ContentType: 'image/jpeg'
};

La carga se realiza con axios con los siguientes encabezados;

const config = { 
                  headers: {
                    'x-amz-acl' : 'public-read', 
                    'Content-Encoding': 'base64',
                    'Content-Type': 'image/jpeg'
                  }
                };

return await axios.put(`${signedURL}`,
  base64data,
  config)
    .then(response => {
      console.log('IMAGE UPLOAD SUCCESS');
      return response.data;
    })

Si cambio el archivo .jpg creado como .txt y lo veo en sublime, los datos son la cadena codificada en base64 en lugar de los datos blob habituales de un jpeg.

¿Qué estoy haciendo mal?

Mostrar la mejor respuesta
Avatar dhj
Respuesta aceptada

Está bien; encontrado la solución;

usar el módulo npm de búfer;

importar { Buffer } desde 'buffer';

Agregué esto a mi función

return await axios.put(`${signedURL}`,
      new Buffer(base64data, 'base64'), // make this a buffer
      config)
        .then(response => {
          console.log('IMAGE UPLOAD SUCCESS');
          return response.data;
        })