File-Upload/Download/Preview

dazzi·2023년 12월 19일

Spring

목록 보기
3/5
post-thumbnail

저장 폴더 위치

@Value("${file.directory}")
private String uploadFolder;

properties 파일에서 설정

file.directory=\\local\\file

파일 업로드

public List<FileVO> uploadFile(List<MultipartFile> files) {
        List<FileVO> fileList = new ArrayList<>();
        File uploadPath = new File(uploadFolder, getFolder());
        if (!uploadPath.exists()) {
            uploadPath.mkdirs();
        }

        for (MultipartFile file : files) {
            FileVO fileVO = new FileVO();
            String uploadFileName = file.getOriginalFilename(); 
            String uuid = UUID.randomUUID().toString();
            File saveFile = new File(uploadPath, uuid);

            try {
                file.transferTo(saveFile);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

            fileVO.setFileId(uuid);
            fileVO.setFileOrgNm(file.getOriginalFilename()); 
            fileVO.setFileSaveNm(uuid); 
            fileVO.setFileSize(file.getSize());
            fileVO.setFilePath(uploadFolder + "/" + getFolder());
            fileList.add(fileVO);
        }

        return fileList;
    }

1) 업로드할 경로 설정

File uploadPath = new File(uploadFolder, getFolder());
        if (!uploadPath.exists()) {
            uploadPath.mkdirs();
        }
  • 루트경로/년/월/일 로 uploadPath 를 설정
  • mkdirs() : 디렉토리(폴더)없으면 생성

2) 업로드할 파일정보 설정

for (MultipartFile file : files) {
	String orgNm = file.getOriginalFilename();
    String extension = getExtension(orgNm);
    String fileId = UUID.randomUUID().toString();
    String uuidSaveNm = UUID.randomUUID().toString();
    String saveNm = uuidSaveNm + extension;

    FileVO fileVO = new FileVO();
    File saveFile = new File(uploadPath, saveNm);

    try {
         file.transferTo(saveFile); // 지정한 경로로 파일 저장
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

-getFolder()

public String getFolder() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        Date date = new Date();
        String str = sdf.format(date);
        return str;
    }

-yyyy/MM/dd 형식으로 폴더를 지정하는 이유
: 하나의 폴더에 생성될 수 있는 파일의 개수에 대한 문제(각 OS마다 폴더(디렉토리)에 저장될 수 있는 파일의 개수가 다름), 한 폴더에 너무 많은 파일이 있는 경우 속도의 저하와 개수의 제한 문제가 생기는 것을 방지
-getExtention(String FileOrgNm)

  • 확장자 추출
public String getExtension(String fileOrgNm) {
        String extension = fileOrgNm.substring(fileOrgNm.lastIndexOf("."));
        return extension;
    }

파일 다운로드

<a href='/post/fileDownload/<c:out value="${file.fileId}"/>' class="me-1 a-tag">${file.fileOrgNm}</a>
public void fileDownload(String fileId, HttpServletResponse response){
    	FileVO fileVO = fileDao.getFileById(fileId);
    	String filename = fileVO.getFileOrgNm();
    	File file = new File(fileVO.getFilePath(), fileVO.getFileSaveNm());
        String encodedFileName;

		try {
			encodedFileName = new String(filename.getBytes("UTF-8"), "ISO-8859-1");
			response.setContentType("application/download");
	    	response.setContentLength((int) file.length());
	    	response.setHeader("Content-Disposition", "attatchment;filename=\"" + encodedFileName + "\"");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
    	
    	try (OutputStream out = response.getOutputStream();
			FileInputStream fis = new FileInputStream(file);) {
			FileCopyUtils.copy(fis, out);
		} catch (IOException e) {
			e.printStackTrace();
		}

Thumbnailator를 이용한 미리보기

 public void preview(FileVO fileVO, HttpServletResponse response) {
        File file = new File(fileVO.getFilePath(), fileVO.getFileSaveNm());
        try {
            String contentType = Files.probeContentType(file.toPath());
            if (contentType != null && contentType.startsWith("image")) { //이미지 일 때만
                response.setContentType(contentType);

                Thumbnails.of(file)
                        .size(100, 100)
                        .outputQuality(0.8)
                        .toOutputStream(response.getOutputStream());
            }
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

0개의 댓글