티스토리 뷰
반응형
호출 시 주어진 파라미터를 가지고 이미지 주소를 조사한 후 이미지 썸네일 파일을 반환하는 API를 생성했다.
이미지 썸네일 파일(삼바파일)을 구한 후 http 통신을 통해 이미지 파일을 반환하는 소스이다.
InputStream inputStream = null;
OutputStream outStream = null;
try{
SmbFile smbf = 전송할 삼바파일 준비;
ServletContext context = request.getSession().getServletContext();
inputStream = smbf.getInputStream();
//File인 경우
//File file = 전송할 파일 준비;
//FileInputStream inputStream = new FileInputStream(file);
String mimeType = "image/jpeg"; //썸네일 파일이 jpg이기 때문에 이렇게 지정한다.
//다른 파일인 경우 적절한 MimeType을 확인하여 지정해준다.
//https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types
response.setContentType(mimeType);
response.setContentLength((int) 삼바파일.length());
String headerKey = "Content-Disposition";
String headerValue = String.format("attachment; filename=\"%s\"", 파일명);
response.setHeader(headerKey, headerValue);
outStream = response.getOutputStream();
byte[] buffer = new byte[4096];
int bytesRead = -1;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outStream.write(buffer, 0, bytesRead);
}
}catch(Exception e){
e.printStackTrace();
//에러가 발생했을 때에는 JSONObject 형식의 응답값을 반환한다.
JSONObject result = new JSONObject();
result.put("code", 100);
result.put("message", "에러가 발생했습니다.");
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.setContentLength(result.toString().getBytes("UTF-8").length);
//getBytes를 할 때 encoding 타입에 따라 length 값이 달라질 수 있다.
//ContentLength 값을 설정하지 않으면 응답값이 전송되지 않을 수 있다.
//parameter의 크기가 설정된 ContentLength 값보다 클 경우 응답값이 잘리거나 전송되지 않을 수 있다.
response.getWriter().print(result);
}finally{
if(inputStream != null){
try{
inputStream.close();
}catch(Exception err){
inputStream = null;
}
}
if(outStream != null){
try{
outStream.close();
}catch(Exception err){
outStream = null;
}
}
}
반응형