JavaScript - Cytoscape Web export network

關於Cytoscape Web這邊要探討的是執行一行JavaScript code來輸出檔案,如pdf, svg, png等,

不過需要在server-side的部分,處理InputStream及加上header的setting,最後是透過OutputStream

來得到我們要的檔案。

而Client的部分只需下一行指令即可,如下:
  1. //vis => new org.cytoscapeweb.Visualization(...)
  2. vis.exportNetwork('png', 'export_network.jsp?type=png');

注意!.exportNetwork的執行需要在vis.ready內。

Server-side的地方是利用Java Server Page撰寫,如下:

  1. String type = request.getParameter("type").toString();
  2. OutputStream o = response.getOutputStream();
  3. if(type.equals("png")){
  4. response.setContentType("image/png");
  5. }else if(type.equals("pdf")){
  6. response.setContentType("application/pdf");
  7. }else if(type.equals("svg")){
  8. response.setContentType("image/svg+xml");
  9. }else{
  10. response.setContentType("text/xml");
  11. }
  12. response.setHeader("Content-Disposition","attachment;filename=network."+type);
  13. byte[] buf = new byte[4096];
  14. int byteRead = 0;
  15. while((byteRead = request.getInputStream().read(buf)) != -1){
  16. o.write(buf, 0, byteRead);
  17. }
  18. o.flush();
  19. o.close();

基本上,與官方網站的PHP範例code算是大同小異,不過要注意的是InputStream

and OutputStream的存取!

---------------------------------------------------------------------------------------
作法二:

照理說,利用cytoscape web exportNetwork就可以順利幫我們把相關的資訊post

到指定的server page,來做串流輸出的動作,搭配指定的標頭。不過,後來新版的chrome

竟然無任何作用!! 也就是說針對vis.exportNetwork('png',...)指令,chrome無任何作用!

不過,IE是OK的,據說Firefox也OK!

因此,我們可以自己來實作post ,建立個別export item專屬的form,來將相關的value傳輸到

Server page。

HTML部分如下:

  1. <form id="png_form" method="post" action="export_network.jsp">
  2. <input type="hidden" name="content">
  3. <input type="hidden" name="type" value="png">
  4. </form>
  5. <form id="svg_form" method="post" action="export_network.jsp">
  6. <input type="hidden" name="content">
  7. <input type="hidden" name="type" value="svg">
  8. </form>
  9. <form id="xml_form" method="post" action="export_network.jsp">
  10. <input type="hidden" name="content">
  11. <input type="hidden" name="type" value="xml">
  12. </form>

JavaScript部分改寫成:

  1. //vis.exportNetwork('png', 'export_network.jsp?type=png');
  2. $("#png_form [name=content]").val(vis.png());
  3. $("#png_form").submit();

在這邊還是會透過vis.png()取得相關產生圖片的資料,依據官網的說明vis.png()會取得以

Base64編碼的圖片字串,因此在Server page時,需要先解碼再轉成byte code方OK。

Server page部分改寫如下:

  1. String type = request.getParameter("type").toString();
  2. String content = request.getParameter("content").toString();
  3. OutputStream o = response.getOutputStream();
  4. byte nerStr[];
  5. if(type.equals("png")){
  6. response.setContentType("image/png");
  7. nerStr = Base64.decodeBase64(content.toString());
  8. }else if(type.equals("svg")){
  9. response.setContentType("image/svg+xml");
  10. nerStr = content.getBytes();
  11. }else{
  12. response.setContentType("text/xml");
  13. nerStr = content.getBytes();
  14. }
  15. response.setHeader("Content-Disposition","attachment;filename=network."+type);
  16. o.write(nerStr);

在png輸出處理的部分會稍麻煩一點,至於其它的格式只要單純地將string轉成byte即可!

如此一來,即使無法使用exportNetwork method還是可以達到我們要的功能!

留言