2017-07-14 3 views
1

私はjsonをxmlに拡張子 ".svg"で保存するdownload()メソッドを呼び出しました。 jsondataはグローバル変数ストアjsonです。jsfでファイルへのダウンロードができないのはなぜですか?

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を見ることができますが、どのようなことを間違ってやっていますダウンロードしていないのですか?私を助けてください。ありがとうございます。

答えて

0

私は間違いました。上記のコードではありませんでした。私たちがcommandLinkを通して作れば、うまくいきませんが、commandButtonで呼び出すとうまくいきます。あなたが知りたいと思えばもっと知りたい場合difference between commandButton vs commandLink

関連する問題