2017-06-05 39 views
0

我使用Tomee創建HTTP服務器,我將jasper報告文件(.jasper)放在webapp目錄中。如果我在瀏覽器中訪問http://localhost:8080/test.jasper,瀏覽器將提示下載文件。如何爲HTTP服務器提供.jasper文件?

在我的java項目中,我創建簡單的代碼來訪問該鏈接,然後預覽報表。我請求async-http-client庫。

DefaultAsyncHttpClient client = new DefaultAsyncHttpClient(); 
BoundRequestBuilder brb = client.prepareGet("http://localhost:8765/qa/test.jasper"); 
Future<InputStream> f = brb.execute(new AsyncCompletionHandler<InputStream>() { 
    @Override 
    public InputStream onCompleted(Response resp) { 
     try { 
      String[][] data = {{"Jakarta"},{"Surabaya"},{"Solo"},{"Denpasar"}}; 
      String[] columnNames = {"City"}; 
      DefaultTableModel dtm = new DefaultTableModel(data, columnNames); 

      Map<String,Object> params = new HashMap<>(); 

      JasperPrint jPrint = JasperFillManager.fillReport(
       resp.getResponseBodyAsStream(), 
       params, 
       new JRTableModelDataSource(dtm) 
      ); 
      JasperViewer jpView = new JasperViewer(jPrint,false); 
      jpView.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      jpView.setSize(800, 600); 
      jpView.setLocationRelativeTo(null); 
      jpView.setVisible(true); 

     } catch (JRException ex) { 
      System.out.println(ex.getMessage()); 
     } 
     return resp.getResponseBodyAsStream(); 
    } 
}); 

從我上面的代碼,我得到一個錯誤Error loading object from InputStream

正常,我可以使用

InputStream input = MainContext.class.getResourceAsStream(filename); 

但我想,以取代HTTP請求的文件輸入流(流過)。

我究竟能爲.jasper文件提供http服務器......?從腐敗InputStream來到

+1

通常,不提供'.jasper'文件。相反,在服務器端執行'.jasper'文件後,可以使用'.pdf','.csv'或其他輸出文件。除非您希望用戶下載'.jasper'文件,否則將其加載到Jaspersoft Studio(意味着要下載並安裝它),並自行運行(並管理數據庫連接)? –

+0

是的,我希望用戶下載'.jasper'文件,通過我創建的java應用程序,用戶下載報告後,報告將顯示在用戶定期報告。 – yuda

回答

0

Error loading object from InputStream錯誤,如果我正常下載.jasper文件瀏覽器通過與JRLoader.loadObjectFromFile(path to file)它不工作也執行報表,因爲tomee給損壞的文件(源文件未損壞)。

我自己的解決方案是將源文件讀取爲流,將其轉換爲base64編碼,並通過HTTP API協議提供。

finput = new FileInputStream(sPath); 
byte[] bFile = Base64.getEncoder().encode(IOUtils.toByteArray(finput)); 

String sFile = new String(bFile); 

客戶端內,我收到它作爲身體的字符串,解碼的base64字符串,將其轉換爲InputStream,最後用InputStream執行報告。

byte[] bBody = Base64.getDecoder().decode(sBody); 
InputStream mainReport = new ByteArrayInputStream(bBody); 
return JasperFillManager.fillReport(mainReport, params); 
相關問題