代码之家  ›  专栏  ›  技术社区  ›  philabreu

如何修复破坏xls文件下载的ExternalContext调用?

  •  1
  • philabreu  · 技术社区  · 7 年前

    我有一种使用jett生成报告的方法,可以为用户显示文件下载对话框:

        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext.responseReset();
        externalContext.setResponseContentType("application/vnd.ms-excel");
        externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"" + "precificacao.xls" + "\"");
    
        //map beans omitted
    
        FileOutputStream saida = null;
        try {
            saida = new FileOutputStream(getClass().getResource("/.").getPath() + "/precificacao.xls");
        } catch (IOException e) {
            System.err.println(getClass().getResource("/.").getPath() + "/precificacao.xls" + ": " + e.getMessage());
        }
    
        InputStream entrada = null;
        try {
    
            entrada = new BufferedInputStream(new FileInputStream(getClass().getResource("/template.xls").getFile()));
    
            ExcelTransformer transformer = new ExcelTransformer();
            Workbook workbook = transformer.transform(entrada, beans);
            workbook.write(saida);
    
            saida.flush();
            saida.close();
    
            facesContext.responseComplete();
        } //catch ommitted
    

    下载的文件已损坏,为文本文档,没有任何字节: print

    在这个下载对话框例程之前,xls是正常生成的,所以我认为我走错了setResponseContentType,尽管我看到了xls的正确术语中的链接: http://www.iana.org/assignments/media-types

    2 回复  |  直到 7 年前
        1
  •  1
  •   Kukeltje    7 年前

    注意到您没有将excel的内容写入响应?因此,响应实际上是空的,因此会导致各种奇怪的行为。

    没有任何字节

    你可以在图片中看到。。。

    对于PDF、图像甚至纯文本文件,您也会遇到同样的问题(虽然这不会给出错误,但只是为空)

    如果使用普通servlet,您甚至会遇到同样的问题。因此,实际上,您的所有标记(excel、jsf、jsf-2、xls)都与问题无关。缩小范围。

    OutputStream saida = externalContext.getResponseOutputStream(); 
    
        2
  •  0
  •   philabreu    7 年前

    我是这样解决的

    public void createRelatorioFichaTecnica(Produto produto) throws IOException {
    
    FacesContext facesContext = FacesContext.getCurrentInstance();
    
    ExternalContext externalContext = facesContext.getExternalContext();
    externalContext.responseReset(); 
    externalContext.setResponseContentType("application/vnd.ms-excel"); 
    externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"" + "precificacao.xls" + "\""); 
    
    //map beans omitted
    OutputStream saida = externalContext.getResponseOutputStream(); 
    try{
    
        InputStream entrada = new BufferedInputStream(new FileInputStream(getClass().getResource("/template.xls").getFile())); 
    
        ExcelTransformer transformer = new ExcelTransformer(); 
        Workbook workbook = transformer.transform(entrada, beans); 
        workbook.write(saida);
    
        saida.flush();
        saida.close();
    
        facesContext.responseComplete();
     } 
     //catch omitted
    }