自定义上传文件路径的处理方案

来源:互联网 发布:好玩的网络手机游戏 编辑:程序博客网 时间:2024/05/09 01:14

背景

知识管理平台文章对应的图片等资源现在是存储在应用部署的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();

        }

    }

 

结论

方案二相对而言比较清晰,可以优先选择