Angular 11 + SpringBoot MultipartFile 업로드/다운로드
Servlet 컨테이너에 파일을 업로드할 때 애플리케이션은 MultipartConfigElement 클래스를 등록해야 합니다. 그러나 Spring Boot는 자동으로 구성하여 작업을 더 쉽게 만듭니다. 이 튜토리얼에서는 Spring Boot RestApi 서버에서 MultipartFile을 업로드/가져오기 위해 Angular 11 앱 클라이언트를 빌드하는 방법을 살펴보겠습니다.
관련 게시물:
I. 기술
스프링 도구 모음 3.9.0.RELEASE
II. 개요
1. 스프링 부트 서버
StorageService
초기화, 모든 파일 삭제, 파일 저장, 파일 로드에 도움이 됨UploadController
는 StorageService
를 사용하여 Rest API 제공: 파일 POST, 모든 파일 GETpom.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를 만듭니다.
스토리지/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
Reference
이 문제에 관하여(Angular 11 + SpringBoot MultipartFile 업로드/다운로드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/loizenai/angular-11-springboot-upload-download-multipartfile-4bbe텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)