Как настроить отображение изображений, загруженных на S3, с помощью сценария nodejs для отображения вместо загрузки? - PullRequest
2 голосов
/ 18 июня 2019

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

Я провел некоторое исследование, и большинство других постов указывают на заголовки, но я убедился, что заголовки верны (image / png)

Кроме того, когда я загружаю тот же файл через консоль AWS (вход в AWS), я могу просмотреть файл в браузере.

var fs = require('fs');
var path = require('path');

AWS.config.update({region: myRegion});

s3 = new AWS.S3({apiVersion: '2006-03-01'});

var uploadParams = {
    Bucket: process.argv[2],
    Key: '', // Key set below
    Body: '', // Body set below after createReadStream
    ContentType: 'image/jpeg',
    ACL: 'public-read',
    ContentDisposition: 'inline'
};
var file = process.argv[3];

var fileStream = fs.createReadStream(file);
fileStream.on('error', function(err) {
  console.log('File Error', err);
});

uploadParams.Body = fileStream;
uploadParams.Key = path.basename(file);


s3.putObject(uploadParams, function(errBucket, dataBucket) {
    if (errBucket) {
      console.log("Error uploading data: ", errBucket);
    } else {
      console.log(dataBucket);
    }
  });

Я получаю успешную загрузку, но не могу просмотреть файл в браузере, так как он автоматически загружается.

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

Содержит пример кода . Ссылка будет содержать примеры кода JS Specific Node для выгрузки и манипулирования объектами s3. используйте его для справки.

0 голосов
/ 18 июня 2019

Вы должны указать contentDisposition как часть заголовков запроса.Вы не можете указать это как часть параметров запроса.Укажите его явно в заголовках, как показано ниже.

var params = {Bucket : "bucketname" , Key : "keyName" , Body : "actualData"};
s3.putObject(params).
on('build',function(req){
req.httpRequest.headers['Content-Type'] = 'application/pdf' ; // Whatever you want
req.httpRequest.headers['ContentDisposition'] = 'inline';   
}).
send( function(err,data){
    if(err){
    console.log(err);
    return res.status(400).json({sucess: false});
    }else{
    console.log(success);
    return res.status(200).json({success: true});
    }
});  

Код для загрузки объектов / изображений в s3

module.exports = function(app, models) {

    var fs = require('fs');
    var AWS = require('aws-sdk');
    var accessKeyId =  "ACESS KEY HERE";
    var secretAccessKey = "SECRET KEY HERE";

    AWS.config.update({
        accessKeyId: accessKeyId,
        secretAccessKey: secretAccessKey
    });

    var s3 = new AWS.S3();

    app.post('/upload', function(req, res){

        var params = {
            Bucket: 'bucketname',
            Key: 'keyname.png',
            Body: "GiveSomeRandomWordOraProperBodyIfYouHave"
        };

        s3.putObject(params, function (perr, pres) {
            if (perr) {
                console.log("Error uploading data: ", perr);
            } else {
                console.log("Successfully uploaded data to myBucket/myKey");
            }
        });
    });

}

Приведенный выше код будет гарантировать, что объект былзагружен на s3.Вы можете видеть его в бункере s3 в браузере, но вы не можете просмотреть его содержимое в бункере s3.

Вы не можете просматривать предметы в S3.S3 это ящик для хранения.Вы можете только загружать и загружать элементы в нем.Если вам нужно просмотреть содержимое, вам нужно будет загрузить и просмотреть его в браузере или любом проводнике по вашему выбору.Если вам просто нужно перечислить объекты в s3.Используйте приведенный ниже код.

Код для перечисления объектов s3

var AWS = require('aws-sdk');
AWS.config.update({accessKeyId: 'mykey', secretAccessKey: 'mysecret', region: 'myregion'});
var s3 = new AWS.S3();

var params = { 
 Bucket: 'bucketName',
 Delimiter: '/',
 Prefix: 's/prefix/objectPath/'
}


s3.listObjects(params, function (err, data) {
 if(err)throw err;
 console.log(data);
});

Используйте список S3 для вывода списка элементов S3.Таким образом, вы можете просмотреть их.Создайте гиперссылку для каждого из перечисленных элементов и укажите ссылку для загрузки s3.Таким образом, вы можете просматривать в браузере, а также загружать его, если вам нужно.

В случае, если вам нужно просмотреть его содержимое через узел JS, используйте код ниже, чтобы загрузить изображение, как будто вы загружаетеэто с удаленного URL.

Код для загрузки содержимого:

var fs = require('fs'),
    request = require('request');

var download = function(uri, filename, callback){
  request.head(uri, function(err, res, body){
    console.log('content-type:', res.headers['content-type']);
    console.log('content-length:', res.headers['content-length']);

    request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
  });
};

download('httpo://s3/URL' 'name.png', function(){
  console.log('done');
});

Код для загрузки изображения в буфер:

const request = require('request');

let url = 'http://s3url/image.png';
request({ url, encoding: null }, (err, resp, buffer) => {
     // typeof buffer === 'object'
     // Use the buffer
     // This buffer will now contains the image data

});

Использованиевыше, чтобы загрузить изображение в буфер.Как только он в буфере, вы можете манипулировать им так, как вам нужно.Приведенный выше код не загружает изображение, но помогает вам манипулировать изображением в s3 с помощью буфера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...