Web开发 - Angular Post导出显示乱码

前端Angular的Post导出Excel,内容全部乱码(不是文件名),而Get方式导出没问题

    $http({
        url: "",
        method: 'POST',
        timeout: 60000,
        headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=utf8'},
        transformRequest: function(obj) {
            var str = [];
            for(var p in obj)
                str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
            return str.join("&");
        },
        data:{}
    }).success(function (data) {
        var blob = new Blob([data], {type: "application/vnd.ms-excel;charset=utf-8"}),
            Temp = document.createElement("a");
    
        Temp.href = window.URL.createObjectURL(blob);
        Temp.download = "XXX.xlsx";
        angular.element('body').append(Temp);
        Temp.click();
    });
 
@RequestMapping(value = "/downloadExcelTemplate.do")
    public void downloadExcelTemplate(HttpServletRequest request, HttpServletResponse response) {
        OutputStream os = null;
        try {
            XSSFWorkbook book = new XSSFWorkbook();
            XSSFSheet sheet = book.createSheet("XXX");
            XSSFRow rowTitle = sheet.createRow(0);
            
            String fileName = "XXX"+"."+Constant.XLSX;
            os = response.getOutputStream();
            response.setCharacterEncoding(Constant.UTF);
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, Constant.UTF));
            book.write(os);
            os.flush();
        } catch (Exception e) {
            e.printStackTrace();
            logger.error(e.getMessage());
        } finally {
            try {
                os.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
阅读 6.5k
3 个回答

1、Post必须使用 responseType: 'arraybuffer'

图片描述

2、Get请求

var aEle = document.createElement("a");
aEle.setAttribute("href", ); // 传中文值encodeURIComponent()
aEle.click();

亲,您是否考虑在后台先生成文件,再返回一个url,让前端直接去get服务器生成的静态文件呢?

先set设置编码
然后再getOutputStream

 
            response.setCharacterEncoding(Constant.UTF);
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, Constant.UTF));
            os = response.getOutputStream();
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题