利用Java的 servlet自定义highchartst图片下载

highcharts 自带的图片下载需要网络,有自己的编码格式,如果编码不同意,很容易图片中出现乱码。可以自己写个servlet,所传参数可以自己控制,而且也可以对图片进行简单处理。

我试过ajax的异步图片下载,结果失败了,这里就不展示了,这里使用表单提交。

所用的jar包,详见链接


 //能够弹出保存文件对话框
function downloadFileByForm(bingtu) {
    var svg = bingtu.getSVG();
    var url = "../complaint/highcharsExportServlet";
    var fileName = "chart";
    var form = $("<form></form>").attr("action", url).attr("method", "post");
    form.append($("<input></input>").attr("type", "hidden").attr("name", "fileName").attr("value", fileName));
    form.append($("<input></input>").attr("type", "hidden").attr("name", "svg").attr("value", svg));
    form.append($("<input></input>").attr("type", "hidden").attr("name", "type").attr("value", "image/png"));
    form.appendTo('body').submit().remove();
}


var bingTu1_Options = {
        exporting:{
            buttons: {
                contextButton: {
                    menuItems: [{
                            text: '下载 JPEG 图片',
                            onclick: function() {
                                downloadFileByForm(this); //js方法
                            }
                        },
                        dafaultMenuItem[7],
                        dafaultMenuItem[8]
                        ]
                }
            }
        }

}

 具体的servlet

public class HighcharsExportServlet extends HttpServlet {
    private static final Log log = LogFactory.getLog(HighcharsExportServlet.class);

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        request.setCharacterEncoding("GBK");// 设置编码,解决乱码问题,具体的根页面保持一致
        String type = request.getParameter("type");
        String svg = request.getParameter("svg");
        String filename = request.getParameter("fileName");
        filename = filename == null ? "chart" : filename;
        ServletOutputStream out = response.getOutputStream();
        if (null != type && null != svg) {
            svg = svg.replaceAll(":rect", "rect");
            String ext = "";
            Transcoder t = null;
            if (type.equals("image/png")) {
                ext = "png";
                t = new PNGTranscoder();
            } else if (type.equals("image/jpeg")) {
                ext = "jpg";
                t = new JPEGTranscoder();
            } else if (type.equals("image/svg+xml"))
                ext = "svg";
            if (null != t) {
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                TranscoderInput input = new TranscoderInput(new StringReader(svg));
                TranscoderOutput output = new TranscoderOutput(stream);
                try {
                    t.transcode(input, output);
                    response.reset();
                    response.setContentLength(stream.size());
                    response.setHeader("Content-disposition", new StringBuilder().append("attachment; filename=")
                            .append(filename).append(".").append(ext).toString());
                    response.setHeader("Content-type", type);
                    out.write(stream.toByteArray());
                } catch (TranscoderException e) {
                    out.print("Problem transcoding stream. See the web logs for more details.");
                    e.printStackTrace();
                }
            } else if (ext.equals("svg")) {
                out.print(svg);
                OutputStreamWriter writer = new OutputStreamWriter(out, "GBK");
                writer.append(svg);
                writer.close();
            } else
                out.print("Invalid type: " + type);
        } else {
            response.addHeader("Content-Type", "text/html");
            out.println("Usage:\n\tParameter [svg]: The DOM Element to be converted."
                    + "\n\tParameter [type]: The destination MIME type for the elment to be transcoded.");
        }
        out.flush();
        out.close();
    }
}

web.xml 的配置

     <servlet>
        <servlet-name>HighcharsExportServlet</servlet-name>
        <servlet-class>com.surekam.cti.complaint.servlet.HighcharsExportServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HighcharsExportServlet</servlet-name>
        <url-pattern>/complaint/highcharsExportServlet</url-pattern>
    </servlet-mapping>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值