김니은 
KimN's Blog
김니은 
  • 분류 전체보기
    • Algorithm
      • Programmers
    • Develop
      • Swift
      • Flask
      • RubyonRails
      • AWS
      • Ardunio
      • Vue
      • Node.js
      • Infra
      • CS
    • IT Story
      • Hackintosh
      • GitHub
      • IT Review

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

태그

  • SWIFT
  • Ruby
  • TOAST
  • 항상 맨 위
  • SWIFTUI
  • Code Snippet
  • Ruby on Rails
  • 카카오 챗봇

최근 댓글

최근 글

티스토리

반응형
hELLO
김니은 
Develop/Vue

[Nuxt.js & Node.js] S3에 다중 이미지 업로드를 해보자

[Nuxt.js & Node.js] S3에 다중 이미지 업로드를 해보자
Develop/Vue

[Nuxt.js & Node.js] S3에 다중 이미지 업로드를 해보자

2020. 4. 5. 21:06
반응형

이번 글은 Nuxt.js와 Node.js 를 이용하여 AWS S3에 다중 이미지를 업로드 해보겠습니다.

​

​

그럼 Frontend 부터 구현해보겠습니다.

​

​

​

 

디자인은 위와 같습니다.

 

// main.vue

<template>
  <div class = "section">
      <div class = "container">
          <Upload />
      </div>
  </div>
</template>

<script>
import axios from 'axios'
import Upload from './Upload.vue'

export default {
  layout: 'user',
  components: {
    Upload
  },
  data () {
    return {
      dialog: false,
      file:'',
      form: {
        name: 'Image'
      }
    }
  },
  methods: {
  }
}
</script>
<style lang="scss" scoped>
</style>

 

일단 하나의 뷰를 만들었습니다.

이후, 컴포넌트로 쓸 Update.vue를 만들어봅시다.

 

 

<template>
<div class="example-drag">
    <div v-show="$refs.upload && $refs.upload.dropActive" class="drop-active"> 
      <h3>Drop files to upload</h3>
    </div>
    <template v-if="files.length">
      <v-data-table 
        dense 
        :headers="headers" 
        :items="files" 
        item-key="name" 
        class="elevation-1"
        hide-default-footer
      > 
      </v-data-table>
      <v-btn
        class="ma-2"
        style="padding:0px;"
        color="info"
        v-on:click="uploadStart(files)"
      > 
        upload
      </v-btn>
    </template>
    <template v-else> 
      <FileUpload
        class="btn btn-primary"
        :multiple="true"
        :drop="true"
        :drop-directory="true"
        v-model="files"
        ref="upload"
        @input="onDrop($event)" 
      > 
      </FileUpload> 
      <v-row>
        <v-col cols="12" sm="12" md="12">
          <div class="text-center p-5">
            <h4>Drop files anywhere to upload<br/>or</h4>
              <v-btn
                class="ma-2"
                style="padding:0px;"
                color="info"
              > 
                <label for="file" style="padding:0px 8px;">Select Files</label>
              </v-btn>
          </div>
        </v-col>
      </v-row>
    </template>
  </div>
</template>

<script>
import FileUpload from "vue-upload-component"
import axios from 'axios'
export default {
  components: {
    FileUpload
  },
  data: ()=> ({
    files: [], //파일 변수
    headers: [ //파일 업로드 후 테이블 영역 헤더부분
      { text: 'name', value: 'name' },
      { text: 'size', value: 'size' },
    ],
  }),
  methods: {
    onDrop(item){ //파일업로드 직후 동작
      //console.log(item)
    },
    async uploadStart() {
      
      //this.files = this.$refs.files;
      
      for (var i = 0; i < this.files.length; i++) {
        var fd = new FormData();
        fd.append('file',this.files[i].file);

      console.log(fd);

      try {
        await axios.post( [ 백엔드 API 주소 ] , fd);
        console.log(fd);
      } catch(err){}
      }
    },
  },
}
</script>

<style scoped>
example-drag .drop-active {
  top: 0;
  bottom: 0;
  right: 0;
  left: 0;
  position: fixed;
  z-index: 9999;
  opacity: .6;
  text-align: center;
  width:100%;
  background: #000;
}
.example-drag .drop-active h3 {
  margin: -.5em 0 0;
  position: absolute;
  top: 50%;
  left: 0;
  right: 0;
  -webkit-transform: translateY(-50%);
  -ms-transform: translateY(-50%);
  transform: translateY(-50%);
  font-size: 40px;
  color: #fff;
  padding: 0;
}

</style>

 

 

Update.vue를 만든 후 axios에 백앤드 api 주소를 입력해주면 됩니다.

​

그럼 백앤드를 제작해봅시다.

 

 

const express = require('express');
const multer = require('multer');
const path = require('path');
const fs = require('fs');
const AWS = require('aws-sdk');
const multerS3 = require('multer-s3');
const pool = require("../../config/database");
const { getimage } = require("./upload_controller");
var router = require('express').Router();

var address;
var uuid = require('uuid/v4');

AWS.config.update({
  accessKeyId: process.env.S3_ACCESS_KEY_ID,
  secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
  region:'ap-northeast-2',
});

const upload = multer({
  storage: multerS3({
    s3: new AWS.S3(),
    bucket: '[버킷 폴더]',

    key: function (req, file, cb) {
        let extension = path.extname(file.originalname);
        cb(null, uuid() + Date.now().toString() + extension);
    },
    acl: 'public-read-write'
  }),
  limits: { fileSize: 5 * 1024 * 1024 },
});

router.post('/', upload.array('file', 5), (req, res) => {
  
  let imgFile = req.files;
  res.json(imgFile);
});

module.exports = router;

 

이전 글에 multer을 이용하여 백앤드 s3 버킷 연동을 했었습니다.

​

아래 주소에서 확인하실 수 있습니다.

 

 

https://blog.naver.com/rile1036/221808142808

 

[Node.js] S3 버킷 연동 (multer)

이번 글은 node.js를 이용해 s3 버킷에 파일을 업로드하는 방법을 작성해보겠습니다.​​S3 버킷 생성하는...

blog.naver.com

 

 

백앤드까지 제작했으면 테스트 해봅시다!

 

​

​

​

이름이 변경되면서 들어간 것을 확인할 수 있습니다.

반응형
저작자표시 (새창열림)

'Develop > Vue' 카테고리의 다른 글

[nuxt.js] 페이지 네이션, 스크롤 페이징  (0) 2020.04.05
[Nuxt.js] 설명 및 Nginx / PM2 연동  (0) 2020.04.05
Vue 애플리케이션 구현 심화편  (0) 2020.01.26
Vue 애플리케이션 만들기  (0) 2020.01.26
Vue 프로젝트 구성  (0) 2020.01.26
    'Develop/Vue' 카테고리의 다른 글
    • [nuxt.js] 페이지 네이션, 스크롤 페이징
    • [Nuxt.js] 설명 및 Nginx / PM2 연동
    • Vue 애플리케이션 구현 심화편
    • Vue 애플리케이션 만들기
    김니은 
    김니은 

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.