본문 바로가기

Java & SpringFramework

POST형식 BASE64인코딩해서 파일다운로드 하기

Server

헤더에 content-length 값을 파일 사이즈가 아닌 base64인코딩 후 사이즈를 넣어줘야함
base64인코딩 할 경우 파일사이즈*(4/3) = content-length값임.
그냥 content-length값 설정 안하면됨.

String fileNm = (String) model.get("fileNm");

File file = new File((String) model.get("filePath"));

long fileSz = file.length();

res.setStatus(HttpServletResponse.SC_OK);

response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

res.setHeader("fileName", CommonUtils.BASE64EncoderStr(fileNm));

if (!isImage) {

response.setHeader("Content-Transfer-Encoding", "binary");

response.setHeader("Pragma", "cache");

}


OutputStream out = res.getOutputStream();

InputStream fis = null;


try {

fis = new FileInputStream(file);

// FileCopyUtils.copy(fis, out);


//3의 배수로 해야됨 (base64인코딩시 3바이트=>4바이트가 됨 [base64사이즈 = bufferSize*4/3])

int BUFFER_SIZE = 3072;

byte[] buffer = new byte[BUFFER_SIZE];


while (fis.read(buffer) != -1) {

out.write(Base64.encodeBase64(buffer));

}

out.flush();

IOUtils.closeQuietly(fis);
IOUtils.closeQuietly(out);



Client

IE, Chrome 구분해서 다운로드 발생하게 해야함.

function fileDownload(attachId){

$.ajax({

method: 'POST'

,url: baseUrl + siteId + '/system/acts'

,headers: {

'authorization': 'Uar ' + authKey

}

,data: {

'actId': 'ACT_DN'

,'attachId': attachId

}

})

.done(function(data, status, req){

  var fileName = base64.decode(req.getResponseHeader('fileName'));

var blob = new Blob([base64ToArrayBuffer(data)], {type: 'octet-stream'});


if (navigator.appVersion.toString().indexOf('.NET') > 0){ //IE

       window.navigator.msSaveBlob(blob, fileName);

} else { //Chrome ...

       var windowUrl = window.URL || window.webkitURL;

       var url = windowUrl.createObjectURL(blob);

  var anchor = document.createElement('a');

       anchor.href = url;

       anchor.download = fileName;

       anchor.click();

       windowUrl.revokeObjectURL(url);

}

})

.fail(function(xhr, status){

alert(xhr.responseText);

});

}