проблема с загрузкой изображения nativescript в кодировку s3

#amazon-s3 #nativescript #angular2-nativescript

#amazon-s3 #nativescript #angular2-nativescript

Вопрос:

У меня возникли проблемы с загрузкой изображения из Nativescript в AWS, и я почти уверен, что это проблема конфигурации.

выберите изображение

     const context = imagepicker.create({
      mode: 'single' // use "multiple" for multiple selection
    });
    await context.authorize();
    const selection: Array<ImageAsset> = await context.present();
    const imageAsset = selection[0];
    const source: ImageSource = await new ImageSource().fromAsset(imageAsset);
    const fileLocation = imageAsset.android ? imageAsset.android : imageAsset.ios;
    const fileType = mime.extension(mime.lookup(fileLocation));
    const image = source.toBase64String(fileType);
    console.log(image);
  

изображение на этом этапе: iVBORw0KGgoAAAANSUhEUgAAB4AAAASwCAIAAACVUsChAAAAA3NCSVQI...

расположение изображения на данный момент: /storage/emulated/0/DCIM/Screenshots/Screenshot_20181106-150854.png

 const fileLocation = imageAsset.android ? imageAsset.android : imageAsset.ios;
const signedUrl = await this.getSignedUrl(fileLocation);
  

Внутренний код для получения signedURL

 const getSignedUrlPromise = (operation, params) => {
  return new Promise((resolve, reject) => {
    s3.getSignedUrl(operation, params, (err, url) => {
      err ? reject(err) : resolve(url);
    });
  });
}
  const params = { 
    Bucket: BUCKET_NAME, 
    Key: `abc123/456/3/${fileName}`,
    ContentType: contentType,
    ContentEncoding: 'base64'
  }
  const url = await getSignedUrlPromise('putObject', params).catch(err => {
    console.log('error', JSON.stringify(err))
    return {
      statusCode: 400,
      body: JSON.stringify(err)
    }
  });
  console.log('success', url);
  return {
    statusCode: 200,
    body: JSON.stringify({ url: url })
  }
  

signedUrl на данный момент:

 https://myproject.s3.amazonaws.com/abc123/456/3/Screenshot_20181106-150854.png?AWSAccessKeyId=xxxxxxxxxxxxxxamp;Content-Encoding=base64amp;Content-Type=image/pngamp;Expires=1555517358amp;Signature=yyyyyyyyamp;x-amz-security-token=long_token
  

Затем, используя signedURL, я загружаю изображение:

     const mimeType = mime.lookup(fileLocation);
    this.http.put(signedUrl, image, {
      headers: {
        'Content-Type': mimeType,
        'Content-Encoding': 'base64'
      }
    }).subscribe((resp) => {
      console.log('resp2', resp);
    });
  }
  

Когда я открываю файл, я вижу вот что
введите описание изображения здесь

и метаданные объекта S3 выглядят корректновведите описание изображения здесь, когда я загружаю файл и открываю его в NP , я вижу значение base64.

 iVBORw0KGgoAAAANSUhEUgAAB4AAAASwCAIAAACVUsChAAAAA3NCSVQI...
  

Я также не могу открыть загруженное изображение
введите описание изображения здесь


ПОПЫТКА 2

Я видел, где некоторые люди использовали буферы, поэтому я изменил свой image код на

 const image = Buffer.from(source.toBase64String(fileType).replace(/^data:image/w ;base64,/, ''), 'base64');
  

изображение по-прежнему не работает, и когда я загружаю и открываю файл с помощью NP , я вижу

 {"type":"Buffer","data":[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,7,128,0,0,4,176,8,2,0,0,0
  

Комментарии:

1. вместо того, чтобы использовать htt0-> put, я использую s3.upload , вы тоже пробовали это?

2. Поскольку это находится во внешнем интерфейсе, я не хочу вводить учетные данные в код клиента.