프로그래밍/- java

ImageAttachServlet :: webapps 외부 폴더 이미지 불러오기

즐겁게 하하하 2024. 2. 8. 10:13
728x90

web.xml

<!-- TODO : image preview -->
<servlet>
    <servlet-name>previewImg</servlet-name>
    <servlet-class>com.jiransnc.framework.utils.ImageAttachServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>previewImg</servlet-name>
    <url-pattern>/prevImage/img/*</url-pattern>
</servlet-mapping>
<!-- end of image preview -->

 

ImageAttachServlet.java

@WebServlet("/prevImage/img/*")
public class ImageAttachServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	private final static Logger logger = LoggerFactory.getLogger(ImageAttachServlet.class);
	
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
    	String sPathInfo = request.getPathInfo();
    
    	if(sPathInfo == null)  {
    		sPathInfo = request.getServletPath();
    	}
        String srchDiv = URLDecoder.decode(sPathInfo.substring(1), "UTF-8");

        //------------------------------------------------------
        // 이미지 처리용
	//------------------------------------------------------
		if("view".equals(srchDiv)){
		//------------------------------------------------------
	        // 이미지 읽어오기
		//------------------------------------------------------						
			try {
				
				String pImgPath = String.valueOf(request.getParameter("imgPath"));
				FileUtil.setPathTraversalPath( pImgPath, FilenameUtils.getName(pImgPath) );
				File fileImg = FileUtil.getPathTraversalFile("FILEPATH", pImgPath, FilenameUtils.getName(pImgPath) );
				
				response.setHeader("Content-Type", getServletContext().getMimeType("filename"));
				response.setHeader("Content-Length", String.valueOf(fileImg.length()));
				response.setHeader("Content-Disposition", "inline; filename=\"" + fileImg.getName().replaceAll("\\r\\n", "")  + "\"");
				
				if(fileImg.exists()) {
					Files.copy(fileImg.toPath(), response.getOutputStream());
					return;
				}
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				logger.error(ExceptionUtils.getFullStackTrace(e));
			} catch (Exception e) {
				// TODO Auto-generated catch block
				logger.error(ExceptionUtils.getFullStackTrace(e));
			}
			
		}
		//------------------------------------------------------
        
        // 이미지가 없는 경우 처리
    	String fileDir = request.getSession().getServletContext().getRealPath("/web/images/main");
    	String filename = "ico_nodata.png";
    	
    	File fileNoImg = new File(fileDir, filename);
    	if(fileNoImg.exists()) {
	        response.setHeader("Content-Type", getServletContext().getMimeType("filename"));
	        response.setHeader("Content-Length", String.valueOf(fileNoImg.length()));
	        response.setHeader("Content-Disposition", "inline; filename=\"" + fileNoImg.getName() + "\"");
	        
	        Files.copy(fileNoImg.toPath(), response.getOutputStream());
        } 
    }
}

 

 

html

function bannerFiles() {
    var filesHTML = '';

    $.ajax({
        type: 'POST',
        url: '/dashboard/selectBannerFilesList.json',
        dataType: 'json',
        data: {},
        async: true,
        traditional: true,
        success: function (filesInfo) {
            var arr = filesInfo;

            filesHTML += "<swiper-container class='mySwiper' pagination='true' pagination-clickable='true' navigation='true' space-between='30' centered-slides='true' autoplay-delay='3500' autoplay-disable-on-interaction='false'>";

            arr.forEach(function (obj) {

                // 이미지 업로드 경로
                var encodedImgUri = encodeURI(obj.filePath + obj.fileSaveNm + "." + obj.fileExt); 

                var linkUrl = "";
                if(obj.linkUrl !=  undefined) var linkUrl = obj.linkUrl;

                // 이미지 태그를 생성하고 filesHTML에 추가
                filesHTML += "<swiper-slide>";
                filesHTML += "	<div class='swiper-slide'>";    
                filesHTML += "	   <a href='javascript:void(0)'>";
                filesHTML += "		  <img src='/prevImage/img/view?imgPath=" + encodedImgUri + "' data-url='"+ linkUrl +"' style='width: 100%; height: 100%; object-fit: contain;'>";  
                filesHTML += "	   </a>";
                filesHTML += "	</div>";
                filesHTML += "</swiper-slide>";
            });

            filesHTML += "</swiper-container>";	            
            $("#bannerFiles").html(filesHTML);

            var mySwiper = document.querySelector('.mySwiper').swiper; // slide selector
            mySwiper.on('click', function () {
                 var currentSlide = mySwiper.slides[mySwiper.activeIndex]; // 현재 보고있는 slide
                 var url = $(currentSlide).find('img').attr("data-url"); 
                 //console.log(imgTag);
                 if(url != "" ) openWindow(url);
            }); 
        }
    });
}
728x90