반응형

자바에서 이전 페이지 URL 주소를 가져오는 방법입니다.

 

String access_url = request.getHeader("referer");

 

반응형
반응형

자바를 이용해서 엑셀 다운로드 기능을 구현하는 방법입니다.

샘플 엑셀파일 없이 자체적으로 생성하는 방법입니다.

.xlsx 확장자를 생성합니다.

 

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

@RequestMapping("/excelDown.do")
public void excelDown(HttpServletResponse response) throws IOException{

    XSSFWorkbook workbook = new XSSFWorkbook();
    XSSFSheet sheet = workbook.createSheet();
    XSSFRow row = null;
    XSSFCell cell = null;

    int rowIndex = 0;
    int cellIndex = 0;
    
    row = sheet.createRow(rowIndex++);
    
    String[] colName = {"컬럼1", "컬럼2", "컬럼3"};
    int[] colWidth = {3000, 5000, 10000};

    // 헤더 추가
    for (int i = 0; i < colName.length; i++){
        cell = row.createCell(i);
        cell.setCellValue(colName[i]);
        sheet.setColumnWidth(i, colWidth[i]); // 컬럼 너비 설정
    }

    // 바디 추가
    String[] row1 = {"값1", "값2", "값3"};
    String[] row2 = {"값4", "값5", "값6"};
    String[] row3 = {"값7", "값8", "값9"};

    List<String[]> testList = new ArrayList<>();
    testList.add(row1);
    testList.add(row2);
    testList.add(row3);

    for (String[] test : testList){
        cellIndex = 0;
        row = sheet.createRow(rowIndex++);

        cell = row.createCell(cellIndex++);
        cell.setCellValue(test[0]);

        cell = row.createCell(cellIndex++);
        cell.setCellValue(test[1]);

        cell = row.createCell(cellIndex++);
        cell.setCellValue(test[2]);
    }

    String fileName = URLEncoder.encode("엑셀 다운 테스트", "UTF-8");
    fileName = fileName.replaceAll("\\+", "%20"); // 파일명에 공백 + 로 나오는거 공백으로 변환

    response.setContentType("application/vnd.ms-excel");
    response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");

    workbook.write(response.getOutputStream());
    workbook.close();
}

 

해당 소스로 돌려보시면 바로 기능 구현 확인 가능합니다.

샘플 소스라 하드코딩으로 작성하였는데 헤더와 바디부분을 수정하면 원하는 형식으로 활용할 수 있습니다.

반응형
반응형

자바로 파일 다운로드 기능 구현 시 파일명에 공백을 설정할 경우 +로 변환되어 나오는 경우를 보신적이 있으실텐데요.

이는 의외로 간단하게 수정할 수 있습니다.

 

소스에서 파일명을 설정하는 부분에 이렇게 적용해 주시면 됩니다.

String fileName = "샘플 파일명.txt";
			
fileName = URLEncoder.encode(fileName, "UTF-8");
fileName = fileName.replaceAll("\\+", "%20"); // 파일명에 띄어쓰기가 있을 때 + 를 공백으로 바꿔줌

 

파일명에 replaceAll 을 이용하면 + 대신 공백으로 정상적으로 노출되는 것을 확인할 수 있습니다.

 

fileName = fileName.replaceAll("\\+", "%20");

반응형
반응형

자바 파일 다운로드 기능 구현할 수 있는 소스입니다.

package sample.a.b.c;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

@RequestMapping("/download.do")
	public void fileDown(HttpServletRequest request, HttpServletResponse response) throws Exception {

		try {
			 // 파일명
			String fileName = "샘플 파일명.hwp";

			// 파일이 있는 경로
			String filePath = "D:\\webapps\\project\\document"; 
			
			File file = new File(filePath, fileName);
			
			int fileSize = (int) file.length();
			
			fileName = URLEncoder.encode(fileName, "UTF-8");
			fileName = fileName.replaceAll("\\+", "%20"); // 파일명에 띄어쓰기가 있을 때 + 를 공백으로 바꿔줌
			
			if(fileSize > 0){
				String encodedFileNm = "attachment; filename*=" + "UTF-8" + "''" + fileName;
				
				response.setContentType("application/octet-stream; charset=utf-8");
				
				response.setHeader("Content-Disposition", encodedFileNm);
				response.setContentLength(fileSize);
				
				BufferedInputStream in = null;
				BufferedOutputStream out = null;
				
				in = new BufferedInputStream(new FileInputStream(file));
				
				out = new BufferedOutputStream(response.getOutputStream());
				
				try {
					byte[] bf = new byte[4096];
					int br = 0;
					
					while((br = in.read(bf))!= -1){
						out.write(bf, 0, br);
						out.flush();
					}
				} finally {
					// 오류
				}
			}
					
		} catch (Exception e) {
			// 오류
		}
		
	}

 

이것도 역시나 파일 다운로드에만 필요한 소스이기 때문에 적절히 잘 활용해서 쓰시면 됩니다.

반응형
반응형

자바로 첨부파일 업로드 하는 기능 구현 방법입니다.

불 필요한 것들은 다 빼고 오직 파일 업로드 기능을 위한 소스라 활용해서 쓰시면 됩니다.

 

  • html
<form name="fileForm" id="fileForm" method="post" action="/fileUpload.do" enctype="multipart/form-data">
    <input type="file" name="file">
</form>

 

  • java
import java.io.File;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

@RequestMapping("/fileUpload.do")
public String fileUpload(MultipartHttpServletRequest mhsr, HttpServletRequest request){
    
    MultipartFile mf = mhsr.getFile("file");
    String path = "C:\\attachment\\"; // 파일 업로드할 경로
    String fileName = mf.getOriginalFilename(); // 저장할 파일 이름, 다른 걸로 변경해서 올릴 수도 있음
    
    String fullPath = path + fileName;

    try {
        mf.transferTo(new File(fullPath)); // 파일 저장하는 부분
    } catch(Exception e) {
        e.printStackTrace();
    }

    return "";
}
반응형
반응형
  •  단일 파일 삭제
import java.io.File;

public void deleteFile(){
		
    File file = new File("C:\\attachment\\text.txt"); // 파일이 저장된 경로
		
	if(file.exists()){ // 파일 존재 여부 확인
	    file.delete(); // 파일 삭제
	} else {
	    // 파일이 존재하지 않음
    }
}

 

 

  • 디렉토리 삭제

디렉토리의 경우 안에 파일이 있으면 삭제가 되지 않기 때문에 폴더 안의 파일들을 삭제해 준 후 디렉토리를 삭제해야 한다.

 

public void deleteFile(){
		
    File file = new File("파일경로");
		
	if(file.exists()){  // 파일 존재 여부 확인
		if(file.isDirectory()){ // 파일이 디렉터리인지 검사
				
			File[] files = file.listFiles();
				
            // 폴더 안의 파일들을 삭제
			for (int i = 0; i < files.length; i++) {
				files[i].delete();
			}
		}
	    file.delete(); // 파일 삭제
			
	} else {
	    // 파일이 존재하지 않음
    }
}
반응형

+ Recent posts