get image path

上一篇將圖片路徑存在DB,而不直接存放圖片在DB

這一篇是從DB取出存放路徑

利用Servlet轉換img tag的src,將圖片顯示

JSP


<h5>照片顯示</h5>


<div id="img">

<div class="preview" style="display:inline;"></div>

</div>

JS 取得圖片路徑並動態產生圖片

$.ajax({
	        url:'GetImageServlet',
	        type : 'POST',
	        datatype : 'json',
	        data : {
	            ajaxAction : 'GET_PICTURE',
	        },
	        async : false,
	        success : function(data, textStatus, xhr) {
	            console.log(data);
	            $(".preview").html("");
	            if(data.result.length > 0){
	                pictureArray = data.result;
	                pictureArrayOrg = data.result;
	                for(var i=0; i<data.result.length;i++){
	                    var elem = "";
	                    elem +="<div class=\"div_"+i+"\">";
	                    elem +="<img id=\"img_"+i+"\" class=\"img\" style=\"margin:10px;border:2px;max-width: 250px;max-height: 250px; solid black;\" src=\""+data.result[i].FILE_PATH+"\">";
	                    elem +="</div>";
	                   $(".preview").append(elem);
	                }
	                index = $(".preview").find("div").length;
	            }
	        },
	        error : function(jqXHR,textStatus,errorThrown){
	            console.log(textStatus);
	        } 
	    });

從DB取出

package servlet.showImage;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/**
 * Servlet implementation class GetImageServlet
 */
@WebServlet(name="/GetImageServlet", urlPatterns = "/view/GetImageServlet")
public class GetImageServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public GetImageServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		response.sendRedirect("showImage.jsp");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		JSONObject json = new JSONObject();
		JSONArray  jsonArray = new JSONArray();
		JSONObject data;
		
		String strPath = "IMG_0007.jpg";//假設DB取出為檔案名稱
		//2016/10/13 修改
        //若是有兩個網域從A網域到B網域則必須寫出完整的路徑,如下(建議用request.getRequestURL取得自己想要的路徑,如String url = request.getRequestURL+"/ImageServlet?file="+strPath;因為下面方法會取得IP,有些時候是無法用IP)
        //String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/" + request.getRequestURI().toString().split("/")[1] +"/ImageServlet?file="+strPath;
        String url = "ImageServlet?file="+strPath;//若只有一個網域則使用此方法即可
		try {
			data = new JSONObject();
			data.put("FILE_PATH", url);
			jsonArray.put(data);
			json.put("result", jsonArray);
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		response.setContentType("application/json");
		response.getWriter().write(json.toString());
	}

}

ImagServlet取得真正的路徑

package servlet.showImage;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ImageServlet
 */
@WebServlet("/ImageServlet")
public class ImageServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public ImageServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doProcess(request, response);
	}
	
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
        response.setContentType("image/jpeg");
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        
        Properties prop = new Properties();
		String propFileName = "config.properties";

		InputStream inputStream = getClass().getClassLoader().getResourceAsStream(propFileName);

		if (inputStream != null) {
			prop.load(inputStream);
		} else {
			throw new FileNotFoundException("property file '" + propFileName + "' not found in the classpath");
		}
		
        try {
            String fileName = request.getParameter("file");
            String path = "";
            // get real path of file
            //path = parsingImagePath(fileName);
            String reSlash = fileName.replaceAll("\\\\","/");//將"\"更換為"/"
            String[] splitStr = reSlash.split("/");//做字串分割

            path = parsingImagePath(prop.getProperty("path"), reSlash);
            // get file as input streaming
            bis = new BufferedInputStream(new FileInputStream(new File(path)));
            // get the output stream
            bos = new BufferedOutputStream(response.getOutputStream());
            // output the image as streaming
            byte data[] = new byte[4096];
            int size = 0;
            size = bis.read(data);
            while (size != -1) {
                bos.write(data, 0, size);
                size = bis.read(data);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bis != null) {
                bis.close();
            }
            if (bos != null) {
                bos.flush();
                bos.close();
            }
        }
	}
	
	private String parsingImagePath(String dir, String path) {
        System.out.println("path:" + path);
        return dir+path;
    }

}

為什麼src會觸發到ImageServlet?

在JSP的img tag 加入src的時候,browser會判斷這是一個新的element,而且是圖檔,就會自動去做一次讀檔的動作

然後因為是web,所以瀏覽器在這上面的行為,會根據src發出一個request去載圖片回來,這個request不是可以控制的,自動會觸發

我們只需要在server side做一個接request,把圖片改成binary stream做flush回去UI的行為並close,這樣就算讀檔完成