Поврежденное изображение при загрузке изображения в AWS-S3 через подписанный URL - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь загрузить изображения в aws-s3 через подписанный URL-адрес с сервера NodeJS (не из браузера). Изображение для загрузки было сгенерировано NodeJS. Я получаю подписанный URL-адрес от aws и успешно загружаю его на s3.

Но мое изображение повреждено. По какой-то причине S3 добавляет несколько заголовков к моему изображению (сравните прилагаемое изображение).

Что я делаю не так?

получая подписанный URL:

    try {
        var params = {
            Bucket: bucketName,
            Key: 'FILE_NAME.png',
            Expires: 60
        };
        const url = await s3.getSignedUrlPromise('putObject', params);
        return url;
    } catch (err) {
        throw err;
    }

загрузка на s3

        var stats = fs.statSync(filePath);
        var fileSizeInBytes = stats["size"];
        const imageBuffer = fs.readFileSync(filePath);

        var formData = {
            'file': {
                value: imageBuffer,
                options: {
                    filename: 'FILE_NAME.png'
                }
            }
        };

        request({ 
            method: 'put',
            url, 
            headers: {
                'Content-Length': fileSizeInBytes,
                'Content-MD': md5(imageBuffer)           
            }, 
            formData 
        }, function (err, res, body) {
             console.log('body',body);
        });

Сравните фактическое изображение с загруженным изображением на s3. S3 добавил несколько заголовков:

compare

Ответы [ 3 ]

0 голосов
/ 05 октября 2019

спасибо, Нарендра, но все по-прежнему ..

0 голосов
/ 23 октября 2019

Попробуйте указать тип содержимого в запросе как Content-Type multipart/form-data.

0 голосов
/ 04 октября 2019

Попробуйте, это будет работать для вас

const AWS = require('aws-sdk')
const uuidv1 = require('uuid/v1')
const mime = require('mime-types')
const FIVE_MINUTES = 5 * 60
const CONTENT_BUCKET = process.env.REACT_APP_CONTENT_BUCKET

const s3 = new AWS.S3({
    'accessKeyId': xxxxxxxxxxxxxxxxxxxxxxxxxx, // Access KEy
    'secretAccessKey': xxxxxxxxxxxxxxxxxxxxxxxxxxx,// Secret Key
    'region': 'us-east-1'
})

export const getSignedUrl = (filename) => {
    const defaultExt = 'png'
    let extension = filename.match(/\.(\w+$)/)
    extension = extension.length > 1 ? extension[1] : defaultExt

    let responseParams = {
        'contentStorageKey': uuidv1() + '-' + filename,
        'contentStorageBucketName': CONTENT_BUCKET,
        'contentType': mime.contentType(extension)
    }

    const params = {
        Bucket: responseParams.contentStorageBucketName,
        Key: responseParams.contentStorageKey,
        Expires: FIVE_MINUTES,
        ContentType: responseParams.contentType,
        ACL: 'public-read'
    }

    try {
        const presignedURL = s3.getSignedUrl('putObject', params)
        return { ...responseParams, presignedURL }
    } catch (ex) {
        console.error(ex)
        throw ex
    }
}
...