Java와 Spring Boot를 사용하여 처음부터 파일 업로드 서비스를 개발해 봅시다
8899 단어 javajavascript
사진 제공: Drew Coffman on Unsplash
제품 및 카테고리에 대한 이미지를 업로드해야 하므로 전자 상거래 앱에 대한 이미지 업로드 기능이 필요했습니다. 나중에 재사용할 수 있는 독립형 서비스로 이 기능을 구축할 것입니다. 이 소스 코드를 사용하여 모든 제품의 이미지를 업로드하고 표시할 수 있습니다.
먼저 및 에서 백엔드를 구축한 다음 다른 자습서에서 웹 클라이언트 및 Android 클라이언트와 통합합니다.
백엔드 데모
파일 업로드 데모를 테스트할 수 있습니다here.
전체 코드 찾기here
백엔드 디자인
3개의 API가 있습니다.
1. 이미지 업로드
2. 이름으로 이미지 가져오기
3. 모든 이미지 가져오기
위의 3가지 API를 설명하는 Java 클래스FileUploadController
를 살펴보겠습니다.
package com.webtutsplus.ecommerce.controller;
import com.webtutsplus.ecommerce.model.FileInfo;
import com.webtutsplus.ecommerce.service.FIleStoreService;
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.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder;
import java.io.IOException;
import java.nio.file.Path;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@RestController
@RequestMapping("/fileUpload")
public class FileUploadController {
@Autowired
FIleStoreService fileStoreService;
//upload a file
@PostMapping("/")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
return fileStoreService.store(file);
}
// get all the files
@GetMapping("/")
public ResponseEntity<List<FileInfo>> getListFiles() {
// first get a stream of all file path present in root file directory
Stream<Path> pathStream = fileStoreService.loadAll();
List<FileInfo> fileInfos = pathStream.map(path -> {
// get file name
String filename = path.getFileName().toString();
// use function to get one file to build the URL
String url = MvcUriComponentsBuilder
.fromMethodName(FileUploadController.class, "getFile", path.getFileName().toString()).build().toString();
// make a fileinfo object from filename and url
return new FileInfo(filename, url);
}).collect(Collectors.toList());
return ResponseEntity.status(HttpStatus.OK).body(fileInfos);
}
// get file by filename
@GetMapping("/files/{filename:.+}")
public ResponseEntity<Resource> getFile(@PathVariable String filename) {
Resource file = fileStoreService.load(filename);
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getFilename() + "\"").body(file);
}
}
각 API에 대해 각각 3개의 메서드를 포함하는 FileStoreService
를 호출합니다. 코드에 많은 주석을 추가했습니다. 명확하지 않은 것이 있으면 아래에 의견을 말하십시오.
package com.webtutsplus.ecommerce.service;
import com.webtutsplus.ecommerce.constants.Constants;
import com.webtutsplus.ecommerce.exceptions.StorageException;
import org.apache.commons.io.FilenameUtils;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.UUID;
import java.util.stream.Stream;
@Service
public class FIleStoreService {
Path rootLocation = Paths.get(Constants.UPLOAD_FILE_DIR);
public String store(MultipartFile file) {
try {
if (file.isEmpty()) {
throw new StorageException("Failed to store empty file.");
}
// find extension of the file,png or jpg
String extension = FilenameUtils.getExtension(file.getOriginalFilename());
// generate a random unique name for the image
String uploadedFileName = UUID.randomUUID().toString() + "." + extension;
// create a path for destination file
Path destinationFile = rootLocation.resolve(Paths.get(uploadedFileName))
.normalize().toAbsolutePath();
// Copy input file to destination file path
try (InputStream inputStream = file.getInputStream()) {
Files.copy(inputStream, destinationFile,
StandardCopyOption.REPLACE_EXISTING);
final String baseUrl =
ServletUriComponentsBuilder.fromCurrentContextPath().build().toUriString();
//create the public Image URl where we can find the image
final StringBuilder imageStringBuilder = new StringBuilder(baseUrl);
imageStringBuilder.append("/fileUpload/files/");
imageStringBuilder.append(uploadedFileName);
return imageStringBuilder.toString();
}
}
catch (IOException e) {
throw new StorageException("Failed to store file.", e);
}
}
public Stream<Path> loadAll() {
// load all the files
try {
return Files.walk(this.rootLocation, 1)
// ignore the root path
.filter(path -> !path.equals(this.rootLocation))
.map(this.rootLocation::relativize);
}
catch (IOException e) {
throw new StorageException("Failed to read stored files", e);
}
}
public Resource load(String filename) {
try {
// read the file based on the filename
Path file = rootLocation.resolve(filename);
// get resource from path
Resource resource = new UrlResource(file.toUri());
if (resource.exists() || resource.isReadable()) {
return resource;
} else {
throw new RuntimeException("Could not read the file!");
}
} catch (MalformedURLException e) {
throw new RuntimeException("Error: " + e.getMessage());
}
}
}
이제 파일 이름이 **_UPLOAD_FILE_DIR_**
디렉토리*에 저장된 고유한 이름으로 변경됩니다.*
[
파일을 올리다
모든 파일 가져오기
업로드된 모든 파일 가져오기
이름으로 단일 파일 다운로드
다음 단계
API를 사용할 . 최종 결과는 다음과 같습니다.
Reference
이 문제에 관하여(Java와 Spring Boot를 사용하여 처음부터 파일 업로드 서비스를 개발해 봅시다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/nilmadhabmondal/let-s-develop-file-upload-service-from-scratch-using-java-and-spring-boot-3mf1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
3개의 API가 있습니다.
1. 이미지 업로드
2. 이름으로 이미지 가져오기
3. 모든 이미지 가져오기
위의 3가지 API를 설명하는 Java 클래스
FileUploadController
를 살펴보겠습니다.package com.webtutsplus.ecommerce.controller;
import com.webtutsplus.ecommerce.model.FileInfo;
import com.webtutsplus.ecommerce.service.FIleStoreService;
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.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder;
import java.io.IOException;
import java.nio.file.Path;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@RestController
@RequestMapping("/fileUpload")
public class FileUploadController {
@Autowired
FIleStoreService fileStoreService;
//upload a file
@PostMapping("/")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
return fileStoreService.store(file);
}
// get all the files
@GetMapping("/")
public ResponseEntity<List<FileInfo>> getListFiles() {
// first get a stream of all file path present in root file directory
Stream<Path> pathStream = fileStoreService.loadAll();
List<FileInfo> fileInfos = pathStream.map(path -> {
// get file name
String filename = path.getFileName().toString();
// use function to get one file to build the URL
String url = MvcUriComponentsBuilder
.fromMethodName(FileUploadController.class, "getFile", path.getFileName().toString()).build().toString();
// make a fileinfo object from filename and url
return new FileInfo(filename, url);
}).collect(Collectors.toList());
return ResponseEntity.status(HttpStatus.OK).body(fileInfos);
}
// get file by filename
@GetMapping("/files/{filename:.+}")
public ResponseEntity<Resource> getFile(@PathVariable String filename) {
Resource file = fileStoreService.load(filename);
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getFilename() + "\"").body(file);
}
}
각 API에 대해 각각 3개의 메서드를 포함하는
FileStoreService
를 호출합니다. 코드에 많은 주석을 추가했습니다. 명확하지 않은 것이 있으면 아래에 의견을 말하십시오.package com.webtutsplus.ecommerce.service;
import com.webtutsplus.ecommerce.constants.Constants;
import com.webtutsplus.ecommerce.exceptions.StorageException;
import org.apache.commons.io.FilenameUtils;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.UUID;
import java.util.stream.Stream;
@Service
public class FIleStoreService {
Path rootLocation = Paths.get(Constants.UPLOAD_FILE_DIR);
public String store(MultipartFile file) {
try {
if (file.isEmpty()) {
throw new StorageException("Failed to store empty file.");
}
// find extension of the file,png or jpg
String extension = FilenameUtils.getExtension(file.getOriginalFilename());
// generate a random unique name for the image
String uploadedFileName = UUID.randomUUID().toString() + "." + extension;
// create a path for destination file
Path destinationFile = rootLocation.resolve(Paths.get(uploadedFileName))
.normalize().toAbsolutePath();
// Copy input file to destination file path
try (InputStream inputStream = file.getInputStream()) {
Files.copy(inputStream, destinationFile,
StandardCopyOption.REPLACE_EXISTING);
final String baseUrl =
ServletUriComponentsBuilder.fromCurrentContextPath().build().toUriString();
//create the public Image URl where we can find the image
final StringBuilder imageStringBuilder = new StringBuilder(baseUrl);
imageStringBuilder.append("/fileUpload/files/");
imageStringBuilder.append(uploadedFileName);
return imageStringBuilder.toString();
}
}
catch (IOException e) {
throw new StorageException("Failed to store file.", e);
}
}
public Stream<Path> loadAll() {
// load all the files
try {
return Files.walk(this.rootLocation, 1)
// ignore the root path
.filter(path -> !path.equals(this.rootLocation))
.map(this.rootLocation::relativize);
}
catch (IOException e) {
throw new StorageException("Failed to read stored files", e);
}
}
public Resource load(String filename) {
try {
// read the file based on the filename
Path file = rootLocation.resolve(filename);
// get resource from path
Resource resource = new UrlResource(file.toUri());
if (resource.exists() || resource.isReadable()) {
return resource;
} else {
throw new RuntimeException("Could not read the file!");
}
} catch (MalformedURLException e) {
throw new RuntimeException("Error: " + e.getMessage());
}
}
}
이제 파일 이름이
**_UPLOAD_FILE_DIR_**
디렉토리*에 저장된 고유한 이름으로 변경됩니다.*[
파일을 올리다
모든 파일 가져오기
업로드된 모든 파일 가져오기
이름으로 단일 파일 다운로드
다음 단계
API를 사용할 . 최종 결과는 다음과 같습니다.
Reference
이 문제에 관하여(Java와 Spring Boot를 사용하여 처음부터 파일 업로드 서비스를 개발해 봅시다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/nilmadhabmondal/let-s-develop-file-upload-service-from-scratch-using-java-and-spring-boot-3mf1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
다음 단계
API를 사용할 . 최종 결과는 다음과 같습니다.
Reference
이 문제에 관하여(Java와 Spring Boot를 사용하여 처음부터 파일 업로드 서비스를 개발해 봅시다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/nilmadhabmondal/let-s-develop-file-upload-service-from-scratch-using-java-and-spring-boot-3mf1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Java와 Spring Boot를 사용하여 처음부터 파일 업로드 서비스를 개발해 봅시다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/nilmadhabmondal/let-s-develop-file-upload-service-from-scratch-using-java-and-spring-boot-3mf1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)