package com.indiScene.commonIO.service;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import com.indiScene.commonIO.dao.CommonIODao;
import com.indiScene.commonIO.dto.CommonDto;
import com.indiScene.commonIO.dto.CommonMusicDto;
/**
@name : CommonIOServiceImpl
@date : 2015. 7. 5.
@auther: 나혁진,김민식
@description :파일 업로드와 음원 등의 공통부분을 정의한 클래스
*/
@Component
public class CommonIOServiceImpl implements CommonIOService {
final Logger logger=Logger.getLogger(this.getClass().getName());
@Autowired
private CommonIODao commonIODao;
/**
@name : imageUpload
@date : 2015. 7. 5.
@auther: 나혁진
@description :이미지 업로드를 음원 추천 등을 정의한 메소드
*/
@Override
public void imageUpload(ModelAndView mav) {
Map<String,Object> map=mav.getModelMap();
HttpServletRequest request = (HttpServletRequest) map.get("request");
MultipartFile upFile=(MultipartFile) map.get("upFile");
String folderName=request.getParameter("folderName"); //요청하는 jsp에서 뽑아낸 servletPath로 게시판 명을 뽑아냈다 그걸 받음
// HttpSession session = request.getSession();
// String root_path = session.getServletContext().getRealPath("/");
// logger.info(root_path);
// String attach_path = "resources/files/attach/";
String fileName = upFile.getOriginalFilename();
String timeName = Long.toString(System.currentTimeMillis()) + "_"
+ fileName;
long fileSize = upFile.getSize();
logger.info("fileName:" + fileName); //이미지 경로에 들어가고 CKEditor 콜백에 들어간다
logger.info("fileSize:" + fileSize); //일단 이미지에선 쓰지 않는다
logger.info("timeName:" + timeName); //실제 이미지 경로에 들어가고 콜백에 들어간다.
String rootDir=request.getSession().getServletContext().getRealPath("/");
// String[] simpleClassName=this.getClass().getSimpleName().split("Service");
// String folderName=simpleClassName[0];
String attachDir="resources/"+folderName.trim()+"Resources/img/"; //콜백으로 넘길용도+실제 파일 들어갈 용도, jsp에서 뽑아낸 폴더 이름을 넣는다
String CKEditorFuncNum=request.getParameter("CKEditorFuncNum");
if(fileSize !=0){
try{
File dirMake=new File(rootDir+attachDir);
if(!dirMake.exists()){ //처음에 폴더 없을때 생성
dirMake.mkdirs();
logger.info("folderMakeSuccess");
}
File file= new File(rootDir+ attachDir + timeName ); //실제 파일이 들어갈 용도
upFile.transferTo(file); //img 새성된 File위치에 파일을 넣는다
logger.info(file.toString());
mav.addObject("CKEditorFuncNum",CKEditorFuncNum); //CkEditor 내부의 function 번호지정
mav.addObject("filePath",file.toString()); //콜백에서 처리할 최초 이미지 경로
}catch (Exception e){
logger.info("ImageUploadError" + e);
}
}
String filePath="/indiscene/" +attachDir+timeName; //콜백으로 넘길 위치용도
mav.addObject("CKEditorFuncNum",CKEditorFuncNum);
mav.addObject("filePath" , filePath);
mav.setViewName("common/imgUpCheck");
}
/**
@name : mainImageFind
@date : 2015. 7. 5.
@auther: 나혁진
@description :리스트에서 최초이미지를 호출하기위한 메소드
*/
@Override
public List<String> mainImageFind(Object list) {
List<String> mainImageList=new ArrayList<String>();
String contentForImg=null;
List<CommonDto> realDto=(List<CommonDto>) list;
for(int i=0;i<realDto.size();i++){
contentForImg=realDto.get(i).getContent();
//logger.info("내용추출" +contentForImg);
Pattern p=Pattern.compile("src=\".*.\" style"); //표준정규식 만듬
Matcher pM=p.matcher(contentForImg);//이미지 Path가 있는 content불러와 표준정규식과 비교
if(pM.find()){
String imagePath=pM.group();
imagePath = imagePath.replaceAll("src=\"", "").replaceAll("\" style", "");
//logger.info("이미지 경로추출" +imagePath);
mainImageList.add(imagePath);
}
}
return mainImageList;
// TODO Auto-generated method stub
}
/**
@name : multiFileUpload
@date : 2015. 7. 5.
@auther: 나혁진
@description :멀티파일을 업로드 하기위한 메소드
*/
public void multiFileUpload(MultipartHttpServletRequest request,CommonDto dto){
List<MultipartFile> upFileList=request.getFiles("file[]"); //넘어오는 다중파일을 List형태로 받는다
if(upFileList!=null){
String folderName=request.getParameter("folderName");
String dir = request.getSession().getServletContext().getRealPath("/resources/"+folderName+"Resources/file");
File folderMake=new File(dir);
if(!folderMake.exists()) folderMake.mkdirs();//폴더없을때 만드는 처리
logger.info(dir);
String fileName="";
String timeName="";
String fileNameForDto="";
String filePathForDto="";
for(int i=0;i<upFileList.size();i++){
MultipartFile upFile=upFileList.get(i);
fileName=upFile.getOriginalFilename();
fileNameForDto+="<>";
fileNameForDto+=fileName;
timeName=Long.toString(System.currentTimeMillis()) + "_"
+ upFile.getOriginalFilename();
try{
File file=new File(dir,timeName);
upFile.transferTo(file);
filePathForDto+="<>"; // <> 을 기준으로 중첩해서 dto에 들어간다
filePathForDto+=file.getAbsolutePath();
}catch(Exception e){
logger.info("fileUploadError" + e);
}
}
dto.setFile_name(fileNameForDto);
dto.setFile_path(filePathForDto);
logger.info("fileNameForDto:" + fileNameForDto);
logger.info("filePathForDto:" + filePathForDto);
}
//멀티파일 처리 끝
}
/**
@name : multiFileDelete
@date : 2015. 7. 5.
@auther: 나혁진
@description :게시글 삭제시 파일도 삭제 되기위한 메소드
*/
@Override
public void multiFileDelete(CommonDto dto) {
// TODO Auto-generated method stub
if(dto.getFile_name()!=null){
File file=null;
String fileNameForDto=dto.getFile_name();
String filePathForDto=dto.getFile_path();
String file_name=null;
String file_path=null;
StringTokenizer pathToken=new StringTokenizer(filePathForDto,"<>");
StringTokenizer nameToken=new StringTokenizer(fileNameForDto,"<>");
while(nameToken.hasMoreTokens() && pathToken.hasMoreTokens()){
file_path=pathToken.nextToken();
logger.info("deleteTokenCheck:" +file_path );
file=new File(file_path);
if(file.exists() && file.isFile()) file.delete();
}
}
}
/**
@name : multiFileDelete
@date : 2015. 7. 5.
@auther: 나혁진
@description :멀티파일 다운로드를 위한 메소드
*/
@Override
public void download(ModelAndView mav) throws IOException {
// TODO Auto-generated method stub
Map<String, Object> map = mav.getModelMap();
HttpServletRequest request = (HttpServletRequest) map.get("request");
HttpServletResponse response = (HttpServletResponse) map.get("response");
String boardNumber =request.getParameter("board_num"); // 필요없음 확인되면 지울것
//파일정보를 뽑아냄
String file_name=request.getParameter("file_name");
String file_path=request.getParameter("file_path");
String fileName = new String(file_name.getBytes("UTF-8"),
"ISO-8859-1");
response.setHeader("Content-Disposition", "attachment;filename="
+ fileName);
response.setHeader("Content-Transfer-Encoding", "binary");
response.setContentType("application/octet-stream");
//file_size가 없으므로 클릭한 file을 File에 객체 생성후 사이즈를 뽑아낸다
File file=new File(file_path);
int file_size=(int)file.length();
response.setContentLength(file_size);
logger.info("filePath" +file.toString() +"\t"+"fileSize"+ file_size);
BufferedInputStream fis = null;
BufferedOutputStream fos = null;
try {
fis = new BufferedInputStream(new FileInputStream(file_path));
fos = new BufferedOutputStream(response.getOutputStream());
byte[] by = new byte[(int) file_size];
int count = fis.read(by);
for (int i = 0; i < count; i++) {
fos.write(by[i]);
}
fos.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fis != null)
fis.close();
if (fos != null)
fos.close();
}
mav.setViewName("");
}
/**
* @name : myUploadMusic
* @date : 2015. 7. 18.
* @author : Kim MinSic
* @description : 내가 업로드한 게시물만 뽑아온다.
*/
@Override
public void myUploadMusic(ModelAndView mav) {
logger.info("myUpload Music Service");
Map<String, Object> map = mav.getModelMap();
HttpServletRequest request = (HttpServletRequest) map.get("request");
int boardSize =10;
String pageNumber = request.getParameter("pageNumber");
if(pageNumber == null) pageNumber ="1";
int currentPage = Integer.parseInt(pageNumber);
int startRow = (currentPage - 1) * boardSize +1;
int endRow = currentPage*boardSize;
String artist_id = request.getParameter("artist_id");
int count=commonIODao.getUploadCount(artist_id);
HashMap<String,Object> rowMap = new HashMap<String,Object>();
rowMap.put("startRow", startRow);
rowMap.put("endRow", endRow);
rowMap.put("artist_id", artist_id);
List<CommonMusicDto> myUploadMusic = commonIODao.getUploadMusic(rowMap);
myUploadMusic.addAll(commonIODao.getMuseMusic(rowMap));
myUploadMusic.sort(new RecentDateComparator());
mav.addObject("boardList",myUploadMusic);
mav.addObject("count",count);
mav.addObject("boardSize",boardSize);
mav.addObject("currentPage",currentPage);
mav.setViewName("myMusic/upload");
}
/**
* @name : myLikeMusic
* @date : 2015. 7. 18.
* @author : Kim MinSic
* @description : 내가 좋아요 누른 게시물을 따로 모아볼 수 있다.
*/
@Override
public void myLikeMusic(ModelAndView mav) {
logger.info("myLike Music Service");
Map<String, Object> map = mav.getModelMap();
HttpServletRequest request = (HttpServletRequest) map.get("request");
String artist_id = request.getParameter("artist_id");
int boardSize =10;
String pageNumber = request.getParameter("pageNumber");
if(pageNumber == null) pageNumber ="1";
int count=commonIODao.getLikeCount(artist_id);
int currentPage = Integer.parseInt(pageNumber);
int startRow = (currentPage - 1) * boardSize +1;
int endRow = currentPage*boardSize;
HashMap<String,Object> rowMap = new HashMap<String,Object>();
rowMap.put("startRow", startRow);
rowMap.put("endRow", endRow);
rowMap.put("artist_id", artist_id);
List<CommonMusicDto> myLikeMusic = commonIODao.getLikeMusic(rowMap);
myLikeMusic.sort(new RecentDateComparator());
mav.addObject("boardList",myLikeMusic);
mav.addObject("count",count);
mav.addObject("boardSize",boardSize);
mav.addObject("currentPage",currentPage);
mav.setViewName("myMusic/like");
}
/**
* @name : myCollaboMusic
* @date : 2015. 7. 18.
* @author : Kim MinSic
* @description : 내 게시글에 콜라보레이션 된 게시글만 따로 모아본다.
*/
@Override
public void myCollaboMusic(ModelAndView mav) {
logger.info("myCollabo Music Service");
Map<String, Object> map = mav.getModelMap();
HttpServletRequest request = (HttpServletRequest) map.get("request");
int boardSize =10;
String pageNumber = request.getParameter("pageNumber");
if(pageNumber == null) pageNumber ="1";
int currentPage = Integer.parseInt(pageNumber);
int startRow = (currentPage - 1) * boardSize +1;
int endRow = currentPage*boardSize;
String artist_id = request.getParameter("artist_id");
int count=commonIODao.getCollaboCount(artist_id);
HashMap<String,Object> rowMap = new HashMap<String,Object>();
rowMap.put("startRow", startRow);
rowMap.put("endRow", endRow);
rowMap.put("artist_id", artist_id);
List<CommonMusicDto> myCollaboMusic = commonIODao.getUploadCollabo(rowMap);
myCollaboMusic.addAll(commonIODao.getMuseCollabo(rowMap));
myCollaboMusic.sort(new RecentDateComparator());
mav.addObject("boardList",myCollaboMusic);
mav.addObject("count",count);
mav.addObject("boardSize",boardSize);
mav.addObject("currentPage",currentPage);
mav.setViewName("myMusic/collabo");
}
/**
* @type : RecentDateComparator
* @date : 2015. 7. 18.
* @author : Kim MinSic
* @description : 따로 뽑아진 DTO 들을 날짜 역순으로 정렬해준다.
*/
class RecentDateComparator implements Comparator<Object>{
@Override
public int compare(Object o1, Object o2) {
java.util.Date d1 = ((CommonMusicDto)o1).getRegister_date();
java.util.Date d2 = ((CommonMusicDto)o2).getRegister_date();
int compare = d1.compareTo(d2);
return compare>0 ? -1 : (compare==0?0:1);
}
}
}