[Vue]이미지 업로드 & 다운로드 구현하기

2025. 2. 17. 11:40·vue.js

vue 파일 업로드 대표이미지

 

 

Vue 3를 활용하여 이미지 파일을 업로드하고 다운로드하는 기능을 구현하는 방법을 소개합니다.
Spring Boot를 사용한 서버 구축아래 포스트에서 확인하시면 됩니다.

2025.02.14 - [Spring]파일 업로드 하기

 

[Spring]파일 업로드 하기

웹 개발을 하다 보면 파일을 업로드해야 하는 경우가 많습니다.프로필 이미지, 첨부 파일, 문서 관리 등 파일 업로드 기능은 정말 자주 사용되죠.이번 글에서는 Spring Boot에서 파일을 업로드하고,

danghunri.tistory.com

 

 


1. 프로젝트 개요

이 프로젝트에서 구현할 기능은 다음과 같습니다.

✅ 이미지 업로드: 사용자가 이미지를 선택 후 서버로 업로드
✅ 이미지 조회: 사용자가 이미지 파일명을 입력하면 해당 이미지를 조회
✅ 이미지 다운로드: 입력한 이미지 파일을 서버에서 다운로드

📁 프로젝트 구조

프로젝트 구조

 

2. Vue 라우터 설정

Vue Router를 활용하여 업로드 페이지와 이미지 조회 페이지를 구성합니다.

📌 src/router/index.js

import { createRouter, createWebHistory } from "vue-router";
import ImageView from "@/views/ImageView.vue";
import UploadView from "@/views/UploadView.vue";

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: "/",
      name: "upload",
      component: UploadView,
    },
    {
      path: "/view",
      name: "imageView",
      component: ImageView,
    },
  ],
});

export default router;
  • / → 이미지 업로드 페이지
  • /view → 이미지 확인 및 다운로드 페이지

3. 업로드 기능 구현

사용자가 파일을 선택한 후, 업로드 버튼을 클릭하면 서버로 파일을 업로드하는 기능을 구현합니다.

📌 src/views/UploadView.vue

<template>
  <div>
    <h2>이미지 업로드</h2>
    <input type="file" @change="handleFileChange" accept="image/*" />
    <button @click="uploadFile">업로드</button>
  </div>
</template>

<script setup>
import { ref } from "vue";

const file = ref(null);

function handleFileChange(event) {
  file.value = event.target.files[0];
}

async function uploadFile() {
  if (file.value) {
    const formData = new FormData();
    formData.append("file", file.value);

    try {
      const response = await fetch("http://localhost:8080/api/files/upload", {
        method: "POST",
        body: formData,
      });

      if (response.ok) {
        alert("업로드 성공!");
      } else {
        alert("업로드 실패!");
      }
    } catch (error) {
      console.error("업로드 중 오류 발생:", error);
      alert("업로드 중 오류 발생!");
    }
  } else {
    alert("파일을 선택하세요.");
  }
}
</script>

📌 구현 내용

  • 사용자가 파일을 선택하면 file 변수에 저장됩니다.
  • uploadFile() 실행 시 FormData를 이용해 서버로 파일을 전송합니다.
  • fetch()를 이용하여 POST 요청을 보내고, 성공 여부를 알림창으로 표시합니다.

4. 이미지 확인 및 다운로드 기능 구현

사용자가 이미지 파일명을 입력하면 해당 이미지를 불러와 미리보기할 수 있도록 하고, 다운로드 버튼을 클릭하면 파일을 다운로드할 수 있도록 합니다.

📌 src/views/ImageView.vue

<template>
  <div>
    <h2>이미지 조회 및 다운로드</h2>
    <input v-model="imageName" placeholder="이미지 이름을 입력하세요" />
    <button @click="checkImage">확인</button>
    <br />
    <img
      v-if="imageUrl"
      :src="imageUrl"
      alt="Uploaded Image"
      style="max-width: 300px; margin-top: 10px"
    />
    <br />
    <button v-if="imageUrl" @click="downloadImage">다운로드</button>
  </div>
</template>

<script setup>
import { ref } from "vue";

const imageName = ref("");
const imageUrl = ref(null);

function checkImage() {
  if (imageName.value.trim() !== "") {
    imageUrl.value = `http://localhost:8080/api/files/images/${imageName.value}`;
  } else {
    alert("이미지 이름을 입력해주세요");
  }
}

async function downloadImage() {
  if (imageUrl.value) {
    let element = document.createElement("a");
    element.setAttribute(
      "href",
      `http://localhost:8080/api/files/download/${imageName.value}`
    );
    element.click();
  }
}
</script>

📌 구현 내용

  • 사용자가 입력한 이미지 파일명을 기반으로 미리보기 URL을 생성.
  • 입력한 파일명을 기반으로 다운로드 API를 호출하여 이미지를 다운로드.

5. Vue 앱 설정 및 실행

📌 src/main.js

import { createApp } from "vue";
import App from "./App.vue";
import router from "./router";

const app = createApp(App);

app.use(router);

app.mount("#app");

📌 src/App.vue

<template>
  <div id="app">
    <nav>
      <RouterLink to="/">업로드 페이지</RouterLink> |
      <RouterLink to="/view">이미지 확인/다운로드 페이지</RouterLink>
    </nav>
    <hr />
    <RouterView />
  </div>
</template>

6. 실행 및 테스트

📌 프로젝트 실행

 

파일 업로드, 다운로드 테스트
 

 

실행 후, 아래와 같은 기능을 확인할 수 있습니다.

1️⃣ http://localhost:5173/ → 파일을 업로드
2️⃣ http://localhost:5173/view → 파일명을 입력하여 이미지 미리보기 및 다운로드


7. 정리

✅ 구현한 기능

✔ 파일 업로드 (FormData 사용)
✔ 이미지 미리보기 (입력한 파일명을 통해 이미지 URL 생성)
✔ 이미지 다운로드 (a 태그를 이용한 다운로드 링크 생성)

'vue.js' 카테고리의 다른 글
  • [Vue]Navigation Guards를 활용한 middleware 구현
  • [Vue]라우터를 활용한 Layout 설정
  • [Vue]v-model을 활용한 양방향 바인딩
  • [Vue] Slot 제대로 이해하기
당훈이
당훈이
당훈이 님의 블로그 입니다.
  • 당훈이
    당훈IT
    당훈이
  • 전체
    오늘
    어제
    • 분류 전체보기 (40)
      • spring (7)
      • vue.js (8)
      • docker (1)
      • javascript (1)
      • aws (21)
      • database (1)
        • oracle (1)
      • nuxt (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    스프링부트
    nuxt usefetch
    nuxt cache
    nuxt fetch
    aws dns
    ec2 nodejs
    spring boot
    aws 스프링
    AWS EC2
    Spring
    vue3
    elb
    AWS ELB
    배포
    EC2
    ec2 domain
    AWS
    ec2 route53
    aws route53
    ec2 spring 배포
    스프링 배포
    nuxt dedupe
    nodejs 배포
    route53
    스프링
    aws domain
    Vue
    중복요청
    aws spring
    nuxt vue
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
당훈이
[Vue]이미지 업로드 & 다운로드 구현하기
상단으로

티스토리툴바