highchart 导出中文问题
2013-10-16 21:02
281 查看
参考 :http://www.blogjava.net/xyzroundo/articles/186217.html
http://blog.csdn.net/zx404068203/article/details/6033040 https://github.com/highslide-software/highcharts.com/issues/1323 http://www.douban.com/note/242998670/
需要的包:
servlet :
/* * @(#)HighChartsServlet.java V0.1 2013年10月16日 * * Copyright 2013 Dreamity Software, Inc. All rights reserved. * This software is the confidential and proprietary information * of Dreamity Software, Inc. ("Confidential Information"). You * shall not disclose such Confidential Information and shall use * it only in accordance with the terms of the license agreement * you entered into with Dreamity Software, Inc. */ package com.nari.slsd.hw.servlet; /** * @Package:com.nari.slsd.hw.servlet * @Title:HighChartsServlet.java * @Description: TODO * @Author:terry * @Date:2013年10月16日下午4:32:15 * @Version:V0.1 */ import java.io.IOException; import java.io.OutputStreamWriter; import java.io.StringReader; import java.util.List; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.batik.transcoder.Transcoder; import org.apache.batik.transcoder.TranscoderException; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.image.JPEGTranscoder; import org.apache.batik.transcoder.image.PNGTranscoder; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.fop.svg.PDFTranscoder; /** * Servlet implementation class for the batik Transcoder */ public class HighChartsServlet extends HttpServlet { private static final long serialVersionUID = 3920224595120519682L; public HighChartsServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8");//注意编码 // 先试着通过request.getParameter来获取导出的参数 // 此时请求必须是GET或者POST且Content-Type是application/x-www-form-urlencoded // 这里无需进行转码, 因为com.highcharts.export.filters.DefaultEncodingFilter已经做了处理 // chrome中Highcharts POST提交的表单Content-Type会是multipart/form-data, 通过request.getParameter是无法获得表单的值(因此此时属于文件上传) // 这是正常的, 因为modules/exporting.js#exportChart()就是这么设置的enctype: 'multipart/form-data' // Adding enctype to the exporting post to allow it to work in HTTPS in Firefox. Issue #839. // https://github.com/highslide-software/highcharts.com/issues/839 // 但是IE中Highcharts POST提交的表单Content-Type会变成application/x-www-form-urlencoded, 又只能通过request.getParameter获得表单的值 // 如果使用ServletFileUpload.parseRequest会直接报错 the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is application/x-www-form-urlencoded // 结果这又是IE的bug, JavaScript动态创建的表单即使设置了enctype为'multipart/form-data'也无济于事, 直接写在HTML中的form元素设置enctype="multipart/form-data"又可以! // 必须设置encoding为multipart/form-data String type = request.getParameter("type"); String svg = request.getParameter("svg"); String filename = request.getParameter("filename"); String width = request.getParameter("width"); // chrome中Highcharts POST提交的表单Content-Type会是multipart/form-data, 通过request.getParameter是无法获得表单的值(因此此时属于文件上传) // 这是正常的, 因为modules/exporting.js#exportChart()就是这么设置的enctype: 'multipart/form-data' // 对IE采用request.getParameter来获取参数值, chrome采用commons-fileupload来获取表单值 if(svg == null) { try { // 通过commons-fileupload来代替servlet 3.0中新的用于文件上传的API(getPart) DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); //判断提交表单的类型是否为multipart/form-data if(!upload.isMultipartContent(request)) { return; } List<FileItem> items = upload.parseRequest(request); for(FileItem item : items) { if(item.isFormField()) { // Process regular form field (input type="text|radio|checkbox|etc", select, etc). String fieldName = item.getFieldName(); // 经过fileupload处理过的request中的表单值需要转码, 否则中文会乱码, DefaultEncodingFilter对此无效 String fieldValue = new String(item.getString().getBytes("ISO-8859-1"), "UTF-8"); if("svg".equals(fieldName)) { svg = fieldValue; } else if("filename".equals(fieldName)) { filename = fieldValue; } else if("width".equals(fieldName)) { width = fieldValue; } else if("type".equals(fieldName)) { type = fieldValue; } } } } catch(FileUploadException e) { } } ServletOutputStream out = response.getOutputStream(); if(null != type && null != svg) { // This line is necessary due to a bug in the highcharts SVG generator for IE // I'm guessing it wont be needed later. 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("application/pdf")) { ext = "pdf"; t = new PDFTranscoder(); } else if(type.equals("image/svg+xml")) { ext = "svg"; } response.addHeader("Content-Disposition", "attachment; filename=chart." + ext); response.addHeader("Content-Type", type); if(null != t) { TranscoderInput input = new TranscoderInput(new StringReader(svg)); TranscoderOutput output = new TranscoderOutput(out); try { t.transcode(input, output); } catch(TranscoderException e) { out.print("Problem transcoding stream. See the web logs for more details."); e.printStackTrace(); } } else if(ext == "svg") { // out.print(svg); OutputStreamWriter writer = new OutputStreamWriter(out, "UTF-8"); 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(); } }
相关文章推荐
- highchart导出图片中文乱码解决
- zk中 chart饼图 中文乱码问题
- aspx导出到excel 无中文乱码问题
- Highchart 时区偏移问题解决。
- 一个关于birt导出pdf chart乱码问题
- Eclipse导出JavaDoc中文乱码问题解决
- Mysql中文乱码以及导出为sql语句和Excel问题解决
- 把DataTable内容导出excel并返回客户端,修改导出中文乱码的问题
- 文件、导出-在Mac系统下Excel转csv文件中文乱码问题解决-by小雨
- phpmyadmin导出数据中文乱码问题
- 关于highcharts的中文导出问题
- bootstrap-table的导出数据功能的使用,以及导出中文时无效的问题(点击无效)。
- Oracle11g创建表空间、创建用户、角色授权、导入导出表以及中文字符乱码问题
- fusionchart客户端导出(wait按钮不变save问题)
- jasperreport6 导出pdf中文不显示问题解决方式
- 解决poi导出excel中文列宽问题
- 不同浏览器上中文文件名的下载/导出乱码问题(Java)
- Jpivot mdx查询编辑器和Jpivot导出PDF、Excel中文乱码问题
- mysql导出数据中文乱码问题
- Java导出Excel表(poi)名中文乱码问题处理