AWS클라우드

[AWS] - NodeJS에서 S3 이용하여 이미지파일 업로드하기

Riucc 2018. 12. 4. 11:41

○ NodeJS에서 S3 이용하여 이미지파일 업로드하기 

 

1. S3 이용하기 위해서 아래 4개를 알아야 한다(IAM 설정)

   'AWS_ACCESS_KEY', 'AWS_SECRET_ACCESS_KEY', 'Bucket', 'REGION' 

   (서울이면 REGION 은 'ap-northeast-2' 이다)


2. NodeJS에서 모듈 2개를 설치해야 한다

   - npm install multer --save

   - npm install aws-sdk --save


3. 코드작성

// app/config/s3.config.js


const AWS = require('aws-sdk');
const env = require('./s3.env.js');

const s3Client = new AWS.S3({
accessKeyId: env.AWS_ACCESS_KEY,
secretAccessKey: env.AWS_SECRET_ACCESS_KEY,
    region : env.REGION
});

const uploadParams = {
Bucket: env.Bucket,
Key: '', // pass key
Body: null, // pass file body
};

const s3 = {};
s3.s3Client = s3Client;
s3.uploadParams = uploadParams;

module.exports = s3;


// app/config./s3.env.js


const env = {
    AWS_ACCESS_KEY: '액세스 키 입력',
    AWS_SECRET_ACCESS_KEY: '비밀 액세스키 입력',
    REGION : 'ap-northeast-2',
    Bucket: '버킷명 입력'
};

module.exports = env;


// app.js


// s3 위해서(multer와 aws-sdk npm install로 설치)
const multer = require('multer');
var storage = multer.memoryStorage()
var upload = multer({storage: storage});
const s3 = require('./app/config/s3.config.js');

// s3 이미지 업로드 위해서
router.post('/api/file/upload', upload.single("file"), function(req, res){
    const s3Client = s3.s3Client;
    const params = s3.uploadParams;
    
    params.Key = req.file.originalname;
    params.Body = req.file.buffer;

    console.log('파일 이름 내놔 : ' + params.Key );

    s3Client.upload(params, (err, data) => {
        if (err) {
            res.status(500).json({error:"Error -> " + err});
        }
        console.log('파일 이름 내놔 : ' + req.file.originalname );
    
        res.json({message: 'upload success! -> filename = ' + req.file.originalname});
    });
});


// index.ejs

// encrtype="multipart/form-data" 안붙이면 'originalname ~' 에러나니 꼭 붙일 것!


<body>
<div class="container">
<h1>File Upload</h1>
<form action="/api/file/upload" method="POST" enctype="multipart/form-data">
<div class="file-field input-field">
<div class="btn grey">
<span>File</span>
<input name="file" type="file">
</div>
</div>
<button type="submit" class="btn">Submit</button>
</form>
</div>
</body>