好久没写博客了,最近做了一个比较有趣的商城项目,里面的业务还真的很复杂,好在做了特殊的处理之后商城也能正常的使用了。但是没中不足的就是图片文件夹和项目掺杂在一块,实在有些难以维护,之后找了点资料就搞了个简单的图片读取服务端程序,还算好用今天得闲了就整理出来给大家参考一下。
1 项目源代码和图片文件夹放一块的优缺点
优点:方便检索、逻辑相对清晰
缺点:源代码体积增大、容易丢失图片、容易被类似struts2这样的漏洞利用(如被黑客删除、篡改)
2 解决方案
项目的上传文件的代码做相应调整,改为和源代码不同的路径;图片显示先经过servlet把图片读取到服务器内存缓冲区,之后显示出来
3 图片读取与显示servlet
package org.lxh; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @说明 该Servlet将本地硬盘的图片输入管道中 * @version 1.0 * @since */ @SuppressWarnings("serial") public class ImageShowServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String uri=request.getRequestURI(); String rs=uri.substring(6); String result=rs.replace("/", File.separator); OutputStream os = response.getOutputStream(); File file = new File("D:\\"+result); FileInputStream fips = new FileInputStream(file); byte[] btImg = readStream(fips); os.write(btImg); os.flush(); } /** * 读取管道中的流数据 */ public byte[] readStream(InputStream inStream) { ByteArrayOutputStream bops = new ByteArrayOutputStream(); int data = -1; try { while((data = inStream.read()) != -1){ bops.write(data); } return bops.toByteArray(); }catch(Exception e){ return null; } } }
4 web.xml的配置
<servlet> <servlet-name>ImageShowServlet</servlet-name> <servlet-class>org.lxh.ImageShowServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ImageShowServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
5 如何使用(一句代码搞定)
<img src="/image${smallImage}" width="50px" height="50px"/>
注:该servlet可作为一个项目打包,和主项目放一块就可以搭配使用了。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/walkcode/article/details/46816951