场景描述:

本问题也是之前谈论的pdf转化为图片的项目,之前有聊到过由于不能正常展示印章而把pdf转化成了PNG图片来展示。而其他的条款由于没有印章这个问题,所以就使用了pdf.js这个插件进行展示,之前展示的文件名都是用的英文是没有问题的。但是后来发现ios里面会展示出来这个名字,被用户看到后不便于理解,所以就想着要改为中文,那么问题就来了。

具体操作解决方案

接着说,直接将文件名改成中文后,发现一切并没有想象的那么简单,在加载pdf进行展示的时候发出错了,404。看里通过浏览器调试看地址也不是正常的,后在网上查询资料发现编码格式有问题,所以就把编码格式改为了gb2312。本地验证通过,心里挺高兴的,但是等我把代码发布到测试环境就由出现了问题。真是太奇葩了,奇葩年年有,今年特别多啊。
说一下本地和测试环境的差别吧,本地单机一个tomcat,测试环境是两台机器,F5负载均衡,然后还用了nginx做跳转。后来同事就说加个过滤器转码试试,想了想这个方法行得通,然后就开工了。加了一个过滤器,在过滤器中将请求地址打印了出来,然后进行转码再打印出来,经过和本地对比发现没有什么区别,但是为嘛就是本地不用filter转化再forward就可以,而测试环境就不行。感觉是跟F5和nginx有关系,但是就是不知道什么情况。还望有大神能解惑一下……
而且nginx 默认的不是charset utf-8;吗,但是我显式的写了这个就又乱码了,郁闷。
Filter代码

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
            ServletException {
        request.setCharacterEncoding("utf-8");
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String url = httpRequest.getRequestURL().toString();
        logger.info("url地址原始" + url);
        url = java.net.URLDecoder.decode(url, "UTF-8");
        logger.info("url地址解码后" + url);
        httpRequest.getRequestDispatcher(url.substring(url.lastIndexOf("/") + 1)).forward(request, response);
        //httpResponse.sendRedirect(url);
        //chain.doFilter(request, response);
}

配置如下

<filter>
        <filter-name>urlFilter</filter-name>
        <filter-class>com.test.UrlFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>urlFilter</filter-name>
        <url-pattern>*.pdf</url-pattern>
    </filter-mapping>

参考
http://blog.csdn.net/zhengyang7754/article/details/47263599
http://blog.csdn.net/xiangcns/article/details/42089189

GitHub 加速计划 / pd / pdf.js
47.48 K
9.86 K
下载
PDF Reader in JavaScript
最近提交(Master分支:3 个月前 )
18284815 [Editor] Update the disclaimer string in the new alt-text dialog (bug 1911738) 3 个月前
fc602c65 And tweak the css in order to take into account that disclaimer can be on two (or more lines). 3 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐