외부사이트로 파일다운로드 링크를 제공해야할 경우가 있는데
보통 일반적으로 개발자가 Customized하여 다운로드링크를 만들어 제공하고 다운로드 처리도 직접로직을 구현하는데.
그렇게 하지않고 프래임워크의 파일업로드 컴포넌트를 이용하여 다운로드링크를 만들어 제공하고,
다운로드처리도 프래임워크에서 제공하는 기본 다운로드경로(/upload/download.do)로 처리하게 했다.
2023.08.08 추가
※ 주의
이 방법은 Session의 파일ID 암호화 키를 이용한 방법으로 외부링크의 다운로드는 되지 않는다.
외부에서 다운로드 : https://blog.daonelab.com/post/19/1932/
1. Service
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.ktnet.ets.hub.common.util.StringUtil;
import smartsuite.security.core.crypto.Cipherutil;
import smartsuite.upload.core.entity.FileDto;
import smartsuite.upload.core.entity.FileItem;
import smartsuite.upload.core.entity.FileList;
import smartsuite.upload.core.factory.FileDtoFactory;
import smartsuite.upload.core.service.FileService;
@Inject
private CipherUtil cipherUtil;
@Inject
private FileService fileService;
@Inject
private FileDtoFactory fileDtoFactory;
private Map<String, Object> getAttFile(List<String> attList)
{
Map<String, Object> resultMap = Maps.newHashMap();
resultMap.put("filePath", "");
resultMap.put("fileName", "");
try
{
List<FileDto> _attFileList = Lists.newArrayList();
for (String grpCd : attList)
{
FileList _fileList = fileService.findList(grpCd);
List<FileDto> _fileDtoList = Lists.transform(_fileList.getItems(), new Function<FileItem, FileDto>()
{
public FileDto apply(FileItem input)
{
return fileDtoFactory.create(input);
}
});
_attFileList.addAll(_fileDtoList);
}
List<String> _filePathList = Lists.newArrayList();
List<String> _fileNameList = Lists.newArrayList();
for (FileDto fileDto : _attFileList)
{
String _queryString = String.format("id=%s", URLEncoder.encode(fileDto.getId(), "UTF-8"));
_filePathList.add(String.format("%s%s?%s", bpUrl, "/aprv/download.do", CipherUtil.encrypt(_queryString)));
_fileNameList.add(fileDto.getName());
}
resultMap.put("filePath", String.join(";", _filePathList));
resultMap.put("fileName", String.join(";", _fileNameList));
}
catch (Exception e)
{
e.printStackTrace();
}
return resultMap;
}
2. Controller
import smartsuite.security.core.crypto.Cipherutil;
@Inject
private CipherUtil cipherUtil;
@RequestMapping(value="/aprv/download.do")
public void download(HttpServletRequest request, HttpServletResponse respone)
{
String _encQueryString = request.getQueryString();
try
{
if (StringUtils.isNotEmpty(_encQueryString))
{
String _decQueryString = CipherUtil.decrypt(_encQueryString);
String[] param = _decQueryString.split("=");
if (param.length == 2)
{
String key = param[0];
String value = param[1];
if ("id".equals(key))
{
response.sendRedirect(String.format("%s?id=%s", "/upload/download.do", value));
}
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}