Angular 11 + SpringBoot MultipartFile 업로드/다운로드

https://grokonez.com/angular-11-springboot-upload-download-multipartfile

Servlet 컨테이너에 파일을 업로드할 때 애플리케이션은 MultipartConfigElement 클래스를 등록해야 합니다. 그러나 Spring Boot는 자동으로 구성하여 작업을 더 쉽게 만듭니다. 이 튜토리얼에서는 Spring Boot RestApi 서버에서 MultipartFile을 업로드/가져오기 위해 Angular 11 앱 클라이언트를 빌드하는 방법을 살펴보겠습니다.

관련 게시물:
  • How to upload MultipartFile with Spring Boot
  • MultipartFile - SpringBoot + JQuery Ajax + Bootstrap.
  • MultipartFile – SpringBoot + AngularJs + Bootstrap.

  • I. 기술


  • 앵귤러11
  • 자바 1.8
  • 스프링 부트 2.0.3.RELEASE
  • 메이븐 3.3.9

  • 스프링 도구 모음 3.9.0.RELEASE

    II. 개요



    1. 스프링 부트 서버




  • StorageService 초기화, 모든 파일 삭제, 파일 저장, 파일 로드에 도움이 됨
  • UploadControllerStorageService를 사용하여 Rest API 제공: 파일 POST, 모든 파일 GET
  • MultipartFile 최대 크기와 같은 매개 변수를 구성하는 application.properties...

  • pom.xml의 Spring Boot Starter 웹 종속성

    2. Angular 11 앱 클라이언트




  • upload-file.service는 파일을 스토리지로 푸시하고 파일을 가져오는 방법을 제공합니다.
  • list-upload.component 파일 목록을 가져와서 표시합니다.
  • form-upload.component가 파일 업로드를 도와줍니다.
  • details-upload.component는 파일 목록의 각 항목에 대한 세부 정보입니다.



  • III. 관행



    1. 스프링 부트 서버



    1.1 스프링 부트 프로젝트 생성



    종속성 있음:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    1.2 파일 시스템용 스토리지 서비스 생성



    4가지 기능으로 StorageService를 만듭니다.
  • public void store(MultipartFile file): 파일 저장
  • public Resource loadFile(String filename): 파일 로드
  • public void deleteAll(): 업로드된 모든 파일 제거
  • public void init(): 업로드 디렉토리 생성

  • 스토리지/StorageService.java
    
    package com.javasampleapproach.spring.uploadfiles.storage;
    
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.core.io.Resource;
    import org.springframework.core.io.UrlResource;
    import org.springframework.stereotype.Service;
    import org.springframework.util.FileSystemUtils;
    import org.springframework.web.multipart.MultipartFile;
    
    @Service
    public class StorageService {
    
        Logger log = LoggerFactory.getLogger(this.getClass().getName());
        private final Path rootLocation = Paths.get("upload-dir");
    
        public void store(MultipartFile file) {
            try {
                Files.copy(file.getInputStream(), this.rootLocation.resolve(file.getOriginalFilename()));
            } catch (Exception e) {
                throw new RuntimeException("FAIL!");
            }
        }
    
        public Resource loadFile(String filename) {
            try {
                Path file = rootLocation.resolve(filename);
                Resource resource = new UrlResource(file.toUri());
                if (resource.exists() || resource.isReadable()) {
                    return resource;
                } else {
                    throw new RuntimeException("FAIL!");
                }
            } catch (MalformedURLException e) {
                throw new RuntimeException("FAIL!");
            }
        }
    
        public void deleteAll() {
            FileSystemUtils.deleteRecursively(rootLocation.toFile());
        }
    
        public void init() {
            try {
                Files.createDirectory(rootLocation);
            } catch (IOException e) {
                throw new RuntimeException("Could not initialize storage!");
            }
        }
    }
    

    1.3 업로드 컨트롤러 만들기



    컨트롤러/UploadController.java
    
    package com.javasampleapproach.spring.uploadfiles.controller;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.stream.Collectors;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.core.io.Resource;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.multipart.MultipartFile;
    import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder;
    
    import com.javasampleapproach.spring.uploadfiles.storage.StorageService;
    
    @Controller
    public class UploadController {
    
        @Autowired
        StorageService storageService;
    
        List files = new ArrayList();
    
        @PostMapping("/post")
        public ResponseEntity handleFileUpload(@RequestParam("file") MultipartFile file) {
            String message = "";
            try {
                storageService.store(file);
                files.add(file.getOriginalFilename());
    
                message = "You successfully uploaded " + file.getOriginalFilename() + "!";
                return ResponseEntity.status(HttpStatus.OK).body(message);
            } catch (Exception e) {
                message = "FAIL to upload " + file.getOriginalFilename() + "!";
                return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body(message);
            }
        }
    
        @GetMapping("/getallfiles")
        public ResponseEntity> getListFiles(Model model) {
            List fileNames = files
                    .stream().map(fileName -> MvcUriComponentsBuilder
                            .fromMethodName(UploadController.class, "getFile", fileName).build().toString())
                    .collect(Collectors.toList());
    
            return ResponseEntity.ok().body(fileNames);
        }
    
        @GetMapping("/files/{filename:.+}")
        @ResponseBody
        public ResponseEntity getFile(@PathVariable String filename) {
            Resource file = storageService.loadFile(filename);
            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getFilename() + "\"")
                    .body(file);
        }
    }
    

    1.4 멀티파트 구성



    application.properties를 엽니다.
    
    spring.servlet.multipart.max-file-size=500KB
    spring.servlet.multipart.max-request-size=500KB
    
  • spring.servlet.multipart.max-file-size : 각 요청에 대한 총 파일 크기를 제한합니다.
  • spring.servlet.multipart.max-request-size : multipart/form-data에 대한 총 요청 크기를 제한합니다.

    1.5 파일 시스템용 초기화 스토리지


    SpringBootUploadFileApplication.java
    
    package com.javasampleapproach.spring.uploadfiles;

  • import javax.annotation.Resource;

    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;

    import com.javasampleapproach.spring.uploadfiles.storage.StorageService;

    @SpringBootApplication
    공개 클래스 SpringBootFileUploadApplication은 CommandLineRunner를 구현합니다. {

    @Resource
    StorageService storageService;
    
    public static void main(String[] args) {
        SpringApplication.run(SpringBootFileUploadApplication.class, args);
    }
    
    @Override
    public void run(String... arg) throws Exception {
        storageService.deleteAll();
        storageService.init();
    }
    

    }

    2. Angular 11 앱 클라이언트



    2.0 서비스 및 구성 요소 생성



    아래 명령을 실행합니다.
  • ng g s upload/UploadFile
  • ng g c upload/FormUpload
  • ng g c upload/ListUpload
  • ng g c upload/DetailsUpload각 구성 요소 선택기에서 app- 접두사를 삭제한 다음 tslint.json rules - "component-selector"을 false로 변경합니다.

    2.1 앱 모듈


    app.module.ts
    
    import { BrowserModule } from '@angular/platform-browser';
    import { NgModule } from '@angular/core';
    import { HttpClientModule } from '@angular/common/http';

  • import { AppComponent } from './app.component';
    import { DetailsUploadComponent } from './upload/details-upload/details-upload.component';
    import { FormUploadComponent } from './upload/form-upload/form-upload.component';
    import { ListUploadComponent } from './upload/list-upload/list-upload.component';

    @Ng모듈({
    선언: [
    앱 구성요소,
    세부사항업로드 구성요소,
    FormUploadComponent,
    ListUploadComponent
    ],
    수입: [
    브라우저 모듈,
    Http클라이언트 모듈
    ],
    공급자: [],
    부트스트랩: [AppComponent]
    })
    내보내기 클래스 AppModule { }

    2.2 파일 업로드 서비스



    업로드/업로드-file.service.ts
    
    import { Injectable } from '@angular/core';
    import { HttpClient, HttpEvent, HttpRequest } from '@angular/common/http';
    import { Observable } from 'rxjs';
    
    @Injectable({
      providedIn: 'root'
    })
    export class UploadFileService {
    
      constructor(private http: HttpClient) { }
    
      pushFileToStorage(file: File): Observable> {
        const formdata: FormData = new FormData();
    
        formdata.append('file', file);
    
        const req = new HttpRequest('POST', '/post', formdata, {
          reportProgress: true,
          responseType: 'text'
        });
    
        return this.http.request(req);
      }
    
      getFiles(): Observable {
        return this.http.get('/getallfiles');
      }
    }
    

    https://grokonez.com/angular-11-springboot-upload-download-multipartfile

    좋은 웹페이지 즐겨찾기