본문 바로가기

Web Dev/Java Spring

Java Backend 개발 : WEB-ZIN 웹진 관리자 zip 파일 업로드 시스템 구축 방법 - 업로드 시 자동으로 파일 압축 풀기 및 업로드

반응형

우선 이와 같은 폴더를 생성해줍니다. 

각 버전에 맞는 폴더가 구성 되어 있어야하고 

또 추후에 새로운 웹진을 등록할 수 있어야 합니다. 

해당 웹진을 서버에 올릴려면 

링크에 따라 해당 버전 웹진을 띄워 줄 수 있는 Url이 필요합니다. 

웹진Contorller

package joonho.controller.user;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import koddi.controller.CommonController;

@Controller
@RequestMapping("/webzine/*.jsp")
public class WebzineController extends CommonController {
	
	
	//@RequestMapping
	//public String index() throws Exception {
	//	return "/webzine/index";
	//}
	
	@RequestMapping
	public String joonho(@RequestParam String vol) throws Exception {
		
		return "redirect:/webzine/joonho/vol" + vol + "/index.html";
	}

}

해당 경로로 들어 오는 모든 url 은 해당 vol 값을 보고 판단하여 

매핑을 시켜 준다. 

추가적으로 개발해주어야 할 것 

관리자 페이지에서 웹진 zip 파일을 업로드하면 

추가 작업 없이 해당 URL로 웹진 서비스가 구동 되어야한다 . 

용량이 커서 zip 파일로 오기 때문에 

업로드 시에 자동으로 해당 zip 파일이 압출 해제가 되어 

저장 되어야 한다. 

업로드 HTML  

<tr>
    <th><span>*</span> $!searchParam.brdTypeNm 웹진파일</th>
    <td>
        <input type="file" name="attachFile4_" required alt="$!searchParam.brdTypeNm 웹진파일" class="file_board" style="width:200px;" />
        <span style="color: red; font-weight: bold;">* zip 파일 업로드 필수 </span>
    </td>
<tr>

 

데이터를 전송하면 Controller에서 받는다 

등록Controller

// 게시판등록처리
@RequestMapping
public String board_write_proc(Model model, HttpServletRequest req) throws Exception {

String saveDir = req.getSession().getServletContext().getRealPath("/webzine/joonho");

String localPath = FileUtils.getUploadPath();

UploadInfo uploadInfo = FileUtils.upload("board", attSaboFileTps, "", req);
ParamInfo searchParam = ParamInfo.getSearchParam(uploadInfo, 20);
BoardInfo info = new BoardInfo(req, uploadInfo);	

if(searchParam.getStr("mode").equals("add")) {

    extractZipFiles(uploadInfo ,saveDir, localPath);
    hpService.insertHpBoardSabo(info, uploadInfo.getAttachFiles());
    throw new RedirectException("저장되었습니다.", searchParam.getStr("redirectUrl"));


throw new MsgException("잘못된 호출 입니다.");
}

extractZipFiles 압축 푸는 함수

import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

private void extractZipFiles(UploadInfo uploadInfo , String saveDir , String localPath) throws IOException {
    	// 받는 파일이 갯수가 4개인데 이 중에 몇번 째 파일의 경로를 가져올 것인지
    	//get(2) -> 0 : 이미지 , 1 : pdf , 2 : zip , 3 : txt
        String zipFilePath = uploadInfo.getAttachFiles().get(2).getAttSaveFilePath();
        
		 String outputFolder = saveDir;
       
		 String FullPath = localPath + zipFilePath;
        
        byte[] buffer = new byte[1024];
        try (ZipInputStream zis = new ZipInputStream(new FileInputStream(FullPath))) {
            ZipEntry zipEntry = zis.getNextEntry();
            
            while (zipEntry != null) {
                String fileName = zipEntry.getName();
                
                
                File newFile = new File(outputFolder + File.separator + fileName);
                if (zipEntry.isDirectory()) {
                    newFile.mkdirs();
                } else {
                    new File(newFile.getParent()).mkdirs();
                    try (FileOutputStream fos = new FileOutputStream(newFile)) {
                        int len;
                        while ((len = zis.read(buffer)) > 0) {
                            fos.write(buffer, 0, len);
                        }
                    }
                }
                zis.closeEntry();
                zipEntry = zis.getNextEntry();
            }
        }
    }

 

우선 Controller 에서 

String saveDir = req.getSession().getServletContext().getRealPath("/webzine/did");

String localPath = FileUtils.getUploadPath();

두개의 경로를 받는다 

saveDir 의 경우 압축 풀린 파일이 저장될 경로를 가져온 값이다. 

localPath  의 경우 

util.xml 에 경로 설정 해놓은 값을 가져온 값이라고 보면 된다. 

모든 웹페이지의 파일들이 저장 되는 로컬저장경로를 미리 세팅해서 불러온 값이다. 

zipFilePath 값은 업로드 한 파일들이 업로드 되어야할 추가 경로 ! 

String FullPath = localPath + zipFilePath; 두개를 합쳐서 사용한다. 

나머지 코드는 해당 경로의 파일을 압축을 풀고 경로를 생성하고 압축 푼 파일을 저장하는 코드 이다. 

코드 변경 없이 사용해도 된다. 

반응형