02장. Spring-Boot / 클라이언트가 보낸 풀 파일

<<学习目标>>

1. 클라이언트에서 보낸 파일을 검색할 수 있습니다.

2. 클라이언트에서 보낸 파일을 꺼낼 수 있습니다.


지금까지 클라이언트가 보낼 때 데이터와 정보를 검색하는 방법을 살펴보았습니다.

이번에는 클라이언트가 파일을 보낼 때 파일을 검색하는 방법을 살펴보겠습니다.

아주 간단해서 짧게 하겠습니다.


클라이언트가 보낸 파일을 가져오기 위해 컨트롤러를 추가해 보겠습니다.

프로젝트 -> com.example.demo.chapter02 -> TestController05 클래스 추가 후 다음 코드 추가

package com.example.demo.chapter02;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

@Controller
public class TestController05 {

	@PostMapping("/chapter02/file")
	public void getFile(@RequestParam("file") MultipartFile file) {
		
		try {
			String originalFilename = file.getOriginalFilename();
			int lastIndex = originalFilename.lastIndexOf('.');
			
			String extension = originalFilename.substring(lastIndex);
			
			String dir = System.getProperty("user.dir") + "/src/main/resources/static/upload/";
			Path path = Paths.get(dir + UUID.randomUUID() + extension);
			
			file.transferTo(new File(path.toString()));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

<<代码说明>>


(하나).클라이언트가 보낸 파일의 매개변수 수신

@RequestParam 주석의 문자열은 클라이언트가 파일을 보낼 매개변수의 이름입니다.

클라이언트가 보낸 파일을 받으려면 매개변수의 데이터 유형이 MultipartFile이어야 합니다.

(2) 클라이언트가 보낸 파일명에서 확장자를 추출합니다.

(3) 클라이언트에서 서버로 보낸 파일을 저장할 저장 경로를 지정합니다.

(4) 클라이언트에서 서버로 보낸 파일을 저장하기 위해 저장 경로에 파일 이름을 지정합니다.

클라이언트가 보낸 파일을 서버에 저장할 때 클라이언트가 보낸 파일 이름과 동일한 파일 이름을 사용하지 마십시오.

사용자(클라이언트)가 서버로 파일을 보내서 같은 이름의 파일이 존재할 수 있습니다.

같은 이름의 파일을 보내면 덮어써서 저장됩니다.

이를 방지하기 위해 서버는 파일명을 다르게 설정하여 저장해야 합니다.

유용한 클래스는 UUID 클래스입니다.

UUID 클래스는 자바에서 유일무이한 값을 생성하기 위해 사용하는 클래스로, UUID 클래스의 randomUUID 메소드를 이용하여 128비트 랜덤 문자열을 생성하면 이를 이용하여 충돌 없이 파일명을 저장할 수 있다.

(5).transferTo 메소드를 사용하여 파일을 서버에 저장하고 매개 변수에는 클라이언트가 보낸 파일이 포함됩니다.

여기서 주의할 점은 (3)에서 클라이언트가 서버로 보낸 파일을 저장하기 위해 저장경로를 지정했는데, 이는 실제 개발에서 잘못된 코드라는 점이다.

실제 개발에서 저장 경로는 하드코딩이나 구성 파일 사용과 같은 다른 방법으로 지정됩니다.

이유가 궁금하시다면 아래 블로그 글을 읽어보세요.

Spring Boot에서 파일을 저장하기 위한 상대 경로로 getRealPath()를 사용하지 마십시오.

문제의 원인 새로 만든 개인 프로젝트에 그림 파일을 저장하기 위해 프로젝트에 있는 Resources 폴더를 이용하려고 했습니다.

리소스에 파일을 저장하면 빌드 또는 배포 시 저장된 파일이 손실됩니다.

www.stir.

프로젝트 추가 -> src/main/resources -> static -> 클라이언트에서 보낸 파일을 저장할 폴더 업로드

프로젝트 실행 후 아래와 같이 파일명에 파일을 넣어 보내주세요.

파일 전송 방법을 모르신다면 https://codingaja./101을 참고해주세요.



이전 기사(https://codingaja./104)에서와 같이 매개변수에 @RequestParam 주석을 달지 않아도 됩니다.



클라이언트가 서버에 파일을 보내면 어떻게 받아야 합니까?

우선, 클라이언트가 서버에 파일을 보내는 두 가지 주요 방법이 있습니다.

1. 각 이름으로 파일을 보내는 방법

2. 이름으로 파일을 보내는 방법

<< 1.如何给每个名字发送文件>>

클라이언트가 각 이름으로 파일을 보낼 때 다음과 같이 보냅니다.



여기에 제목 삽입




클라이언트가 이와 같이 파일을 보내면 서버는 다음과 같은 매개변수로 각 파일을 받을 수 있습니다.


<< 2.如何发送文件到一个名字>>

클라이언트가 단일 이름으로 파일을 보내면 여러 가지 방법으로 나뉩니다.

1. HTML 만을 사용하여 단일 이름으로 파일을 보내는 방법

2. JS를 사용하여 단일 이름으로 파일을 보내는 방법

가지다

첫 번째< 2-1。 让我们看看如何仅使用 HTML 将文件发送到单个名称 >> 서버에서 파일을 검색하는 방법

클라이언트는 다음과 같이 HTML만 사용하여 단일 이름으로 파일을 보낼 수 있습니다.

파일을 보내는 중이므로 이름을 파일로 변경했습니다.

<!
DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="/chapter02/files/type1" method="POST" enctype="multipart/form-data" style="border: 1px solid black"> <input type="file" multiple="multiple" name="files" ><br> <input type="submit" value="전송"> </form> </body> </html>

클라이언트는 위와 같이 이름 매개변수에 있는 파일을 보내지만 원격 서버는 다음과 같이 배열 또는 (List 또는 ArrayList)를 사용하여 파일을 검색할 수 있습니다.


코드 설명은 이전 글(https://codingaja./105)에서 이미 찾았기 때문에 생략했습니다.

Postman으로 테스트할 때 전송 파일 이름에 있는 파일은 다음과 같습니다.



JS 및 Jquery를 사용하여 이름이 있는 파일 배열을 보낼 수 있습니다(왼쪽).

그런데 이렇게 파일을 보내면 서버에서 받을 수가 없어요

따라서 파일은 이름(오른쪽)으로 보내야 합니다.



마지막으로 클라이언트가 파일과 함께 다른 데이터를 보내면 어떻게 될까요?

다음과 같이 페이지 구조를 보자

<!
DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="/chapter02/files/type4" method="POST" enctype="multipart/form-data" style="border: 1px solid black"> <label>아이디 : <input type="text" name="id"></label><br> <label>비밀번호 : <input type="text" name="pw"></label><br> <label>비밀번호 확인 : <input type="text" name="pwchk"></label><br> <label>닉네임 : <input type="text" name="nickname"></label><br> <label>프로필 이미지 : <input type="file" multiple="multiple" name="file"></label><br> <input type="submit" value="전송" onclick="upload(event)"> </form> </body> </html>



여기에 제목 삽입






이 경우 서버에서 개별적으로 또는 DTO에서 함께 프로필 이미지를 받을 수 있습니다.

파일만 받는 경우 파일만 받는 매개변수를 선언할 수 있습니다.


DTO에서 함께 수신하고 파일을 수신하기 위해 DTO에서 MultipartFile 타입의 멤버 변수를 선언하고(1), DTO만 컨트롤러의 파라미터로 선언합니다.

DTO에는 게터와 세터가 있어야 합니다.



지금까지 클라이언트가 보낸 파일과 이를 꺼내는 방법에 대해 살펴보았습니다.

마지막으로 이전 글(클라이언트가 보낸 데이터를 얻는 방법)과 (클라이언트가 보낸 데이터를 얻는 방법)과 동일하므로 앞의 두 글을 정리하면 모든 종류의 데이터를 얻을 수 있다.

아무 어려움 없이 고객에 의하여 보내십시오.