背景
知识管理平台文章对应的图片等资源现在是存储在应用部署的tomcat的相对目录下,这样在引用图片时直接采用<imgsrc=”upload/561a72ac-1f02-4fa3-b662-cce0ab30a7d2.jpg”>的方式引用。这个路径默认全路径是相对部署的知识管理平台的上下文路径。如:
http://localhost:8088/kms/upload/561a72ac-1f02-4fa3-b662-cce0ab30a7d2.jpg
但是实际部署时,一般是将图片存放在共享盘阵上。或者是因为存在多个测试系统,系统共享这些图片资源。现有的处理方式是满足不了这样的需求的。因此需要采用某种方式支持用户自定义图片的存放路径。不管是本地路径还是共享路径。
有如下两种方案提供参考:
方案一
在tomcat重新部署一个应用KmsImage,这个应用的路径指定为图片的目录。上下文可以固定为kms_image。例如配置文件如下:
<?xml version="1.0" encoding="utf-8"?>
<Context docBase="D:\Image\DYRKB" path="/kms_image" reloadable="true">
</Context>
访问图片路径的IP和端口和知识管理平台部署的IP和端口一致。类似:
http://100.0.6.152:8080/kms_image/561a72ac-1f02-4fa3-b662-cce0ab30a7d2.jpg
需要修改的地方:
1. 需要自动上传文件的路径为应用KmsImage中指定的docBase
2. 需要修改图片元素image中src为部署的应用KmsImage的访问路径【或者该路径也是可以配置的】
3. 如果是共享文件路径,需要将共享文件路径映射到本地磁盘
方案二
图片信息返回采用流的方式返回,而不是现在的直接引用文件的方式。路径还是可以和原先一样即类似:
http://100.0.6.152:8080/kms/upload/561a72ac-1f02-4fa3-b662-cce0ab30a7d2.jpg
后台实现:
增加一个servlet,专门用于获取图片信息。然后在web.xml中配置获取servlet的映射路径为upload。
web.xml中增加配置:
<servlet>
<servlet-name>imageaction</servlet-name>
<servlet-class>com.dayang.dyr.knowledge.controller.ShowImageServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>imageaction</servlet-name>
<url-pattern>/upload/*</url-pattern>
</servlet-mapping>
public class ShowImageServlet extends HttpServlet {
private static final Logger log = Logger.getLogger(ShowImageServlet.class);
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
doProcess(req, res);
}
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
doProcess(req, res);
}
public void doProcess(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
OutputStream toClient = null;
FileInputStream in = null;
try {
StringBuffer url = req.getRequestURL();
String imageName = url.substring(url.lastIndexOf("/"), url.length());
toClient = res.getOutputStream(); //得到向客户端输出二进制数据的对象
//todo:需要替换为实际的文件的路径
String picPath = "E:\\test" + File.separator + imageName;
in = new FileInputStream(new File(picPath));
byte b[] = IOUtils.toByteArray(in);
toClient.write(b);
} catch (Exception e) {
log.error("Get Image error", e);
PrintWriter pw = res.getWriter(); //得到向客户端输出文本的对象
pw.write(e.getMessage());
pw.close();
} finally {
if (toClient != null)
toClient.close();
if(in != null)
in.close();
}
}
结论
方案二相对而言比较清晰,可以优先选择