为什么下载到文件在jsf中不起作用?

时间:2017-07-14 01:18:52

标签: jsf download richfaces

我调用了download()方法将json保存到扩展名为“.svg”的xml中。 jsondata是全局变量商店json。

public void download(){
File file = exportFile(jsondata);
         HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();

     writeOutContent(response, file, file.getName());
     FacesContext.getCurrentInstance().responseComplete();
     FacesContext.getCurrentInstance().renderResponse();

}

和exportFile(jsondata)是

public File exportFile(String jsonData){


File xmlFile = null;
        try {
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
            Document doc = docBuilder.newDocument();
            JSONObject jsonObject = new JSONObject(jsonData);

            Element root = doc.createElement("web");
            doc.appendChild(root);

            Element rootElement1 = doc.createElement("class");
            rootElement1.appendChild(doc.createTextNode(jsonObject.getString("class")));
            root.appendChild(rootElement1);

            JSONArray jsonArray1 = (JSONArray) jsonObject.get("nodes");
            Element rootElement2 = doc.createElement("nodes");
            root.appendChild(rootElement2);
            for (int i = 0; i < jsonArray1.length(); i++) {
                Element staff = doc.createElement("node");
                rootElement2.appendChild(staff);
                JSONObject childObject = (JSONObject) jsonArray1.get(i);
                Iterator<String> keyItr = childObject.keys();
                while (keyItr.hasNext()) {
                    String key = keyItr.next();
                    Element property = doc.createElement(key);
                    property.appendChild(doc.createTextNode(childObject.getString(key)));
                    staff.appendChild(property);
                }
            }
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            //for pretty print
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            DOMSource source = new DOMSource(doc);

            xmlFile = new File("file.svg");
            //write to console or file
//            StreamResult console = new StreamResult(System.out);
            StreamResult file = new StreamResult(xmlFile);

            //write data
//            transformer.transform(source, console);
            transformer.transform(source, file);
        } catch (Exception pce) {
            pce.printStackTrace();
        }
        return xmlFile;
    }

最后写一个文件writeOutContent()

public void writeOutContent(final HttpServletResponse res, final File content, final String theFilename) {
    if (content == null) {
        System.out.println("content is null");
        return;
    }
    try {
        res.setHeader("Content-Disposition", "attachment; filename=\"" + theFilename + "\"");
        System.out.println("res " + res.getHeader("attachment; filename=\"" + theFilename + "\""));
        res.setContentType("application/octet-stream");
        FileInputStream fis = new FileInputStream(content);
        OutputStream os = res.getOutputStream();
        int bt = fis.read();
        while (bt != -1) {
            os.write(bt);
            bt = fis.read();
        }
        os.flush();
        fis.close();
        os.close();
    } catch (Exception ex) {
        Logger.getLogger(DownloadFile.class.getName()).log(Level.SEVERE, null, ex);
    }
}

我可以在控制台中看到xml但是它没有下载的错误是什么?请帮我。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

我弄错了。它不在上面的代码中。如果我们通过commandLink进行操作,那么它就不会工作,但是如果通过commandButton进行调用则会有效。如果你想知道更多,请阅读difference between commandButton vs commandLink