成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

服務端Word文件模板書簽替換、轉換文件類型的另類實現

開發 前端
市面上處理文字的的辦公軟件有很多,包括WPS、MSOffice、永中OFFICE,當然還有開源的openoffice、liboffice等。我們在項目開發過程中經常會遇到預覽word文件,數據庫中數據自動填充word模板等需求。

市面上處理文字的的辦公軟件有很多,包括WPS、MSOffice、永中OFFICE,當然還有開源的openoffice、liboffice等。我們在項目開發過程中經常會遇到預覽word文件,數據庫中數據自動填充word模板等需求。現在能夠滿足以上需求的技術有很多,服務端可通過POI\aspose等處理,也可通過客戶端調用OFFICE組件處理,本人曾經在這方便做了很多測試,最終發現兼容性最好的、接口對JAVA程序員最友好的就屬永中OFFICE,因為它基本就是JAVA實現的,使用起來非常方便。

我的測試環境使用的是永中2016版本,它運行要求JRE1.6,且我發現它應該是對JRE進行過重構,按永中SDK要求編寫代碼通過自ORACAL官網下載的jdk1.6編譯后運行是失敗的,現在都2021年了,我們的項目絕大多數都JDK1.8以上版本了,那么怎么讓SDK兼容我們的項目呢?怎么實現標題中提到的兩個需求呢?下面我說說我的處理方法吧:

1、下載永中軟件并安裝(官網下載即可)

2、安裝后打開安裝路徑可以看到如下圖 

永中軟件安裝目錄 

JRE:即永中軟件的運行環境

Yozo_Office.jar: 即永中為開發者提供的SDK,可以將jar導入到工程中

3、編寫WORD文件處理服務組件

處理word文件的代碼片段,詳細代碼請在文后下載源碼查閱 

  1. 處理word文件的代碼片段,詳細代碼請在文后下載源碼查閱     
  2.  
  3. /** 
  4.      * 將word文件轉換為對應格式的文件的字節數組 
  5.      * @param type 將word文件轉換成的文件格式 pdf、html\ofd\txt\xml 
  6.      * @return 
  7.      * @throws IOException 
  8.      */ 
  9.     public byte[]  convertFile(String type) throws IOException { 
  10.         int typePdf = FileConstants.TYPE_PDF; 
  11.         if("html".equals(type.toLowerCase())) {//此功能轉換后亂碼,后期可采用 this.workbook.saveAs("D:/2.html"); 方式存儲html后,將字節返回 
  12.             typePdf= FileConstants.FILETYPE_HTML; 
  13.         }else if("ofd".equals(type.toLowerCase())) { 
  14.             typePdf= FileConstants.TYPE_OFD;    // 這個是不成功的,應該是版本太低 
  15.         }else if("txt".equals(type.toLowerCase())) { 
  16.             typePdf = FileConstants.TYPE_TXT; 
  17.         }else if("xml".equals(type.toLowerCase())) { 
  18.             typePdf = FileConstants.FILETYPE_XML; 
  19.         }else if("doc".equals(type.toLowerCase())||"xls".equals(type.toLowerCase())||"ppt".equals(type.toLowerCase())) { 
  20.             typePdf = FileConstants.TYPE_MS; 
  21.         }else if("docx".equals(type.toLowerCase())||"xlsx".equals(type.toLowerCase())||"pptx".equals(type.toLowerCase())) { 
  22.             typePdf = FileConstants.TYPE_MS_EX; 
  23.         } 
  24.          
  25.         return this.workbooks.getWorkbookAsByteArray(workbook, typePdf); 
  26.     } 
  27.  
  28. /** 
  29.      * 替換word模板中的書簽 
  30.      * @param jsonObject    數據內容 {“bookmarkname”:”test“} 
  31.      */ 
  32.     public void replaceBookMark(JSONObject jsonObject) { 
  33.         BookMarks bookMarks = this.document.getBookMarks(); 
  34.         BookMark[] allBookmarks = bookMarks.getAllBookmarks(); 
  35.         for(BookMark bookMark:allBookmarks){ 
  36.             String name = bookMark.getName(); 
  37.             TextRange range = bookMark.getRange(); 
  38.             //if(name!=null)name=name.replace("PO_",""); 
  39.             String value = ""
  40.             Object o = jsonObject.get(name); 
  41.             if(o!=null){ 
  42.                 value=jsonObject.get(name).toString(); 
  43.             } 
  44.             try {  
  45.                     range.insertText(value);                
  46.             }catch (Exception e){ 
  47.                 range.insertText(value); 
  48.             } 
  49.         } 
  50.     } 
  51.  
  52. /** 
  53.      * 導出數據成excel文件 
  54.      * @param jsonObject    數據內容 {“bookmarkname”:”test“} 
  55.      */ 
  56. public byte[] exportData2File(JSONArray taskArray,int allrow) { 
  57.  

4、(重點)解決word文件處理組件與我們的項目文件交互問題

本人通過SOCKET即時通訊服務解決數據交互問題 

  1. /** 
  2.  * 文件傳輸Server端<br> 
  3.  * 功能說明: 
  4.   * @Author 空中智囊 
  5.  * @Date 2016年09月01日 
  6.  * @version 1.0 
  7.  */ 
  8. public class SocketService extends ServerSocket { 
  9.     private static final int SERVER_PORT = 8899; // 服務端端口 
  10.  
  11.     private WordUtil wordUtil=null
  12.     public SocketService() throws Exception { 
  13.         super(SERVER_PORT); 
  14.         this.wordUtil=new WordUtil(); 
  15.     } 
  16.  
  17.     /** 
  18.      * 使用線程處理每個客戶端傳輸的文件 
  19.      * @throws Exception 
  20.      */ 
  21.     public void load() throws Exception { 
  22.         System.out.println("服務端啟動,監聽端口為:"+SERVER_PORT); 
  23.         while (true) { 
  24.             // server嘗試接收其他Socket的連接請求,server的accept方法是阻塞式的 
  25.             Socket socket = this.accept(); 
  26.             socket.setSoTimeout(1200000); 
  27.             /** 
  28.              * 我們的服務端處理客戶端的連接請求是同步進行的, 每次接收到來自客戶端的連接請求后, 
  29.              * 都要先跟當前的客戶端通信完之后才能再處理下一個連接請求。 這在并發比較多的情況下會嚴重影響程序的性能, 
  30.              * 為此,我們可以把它改為如下這種異步處理與客戶端通信的方式 
  31.              */ 
  32.             // 每接收到一個Socket就建立一個新的線程來處理它 
  33.             new Thread(new Task(socket,wordUtil)).start(); 
  34.  
  35.         } 
  36.     } 
  37.     /** 
  38.      * 入口 
  39.      * @param args 
  40.      */ 
  41.     public static void main(String[] args) { 
  42.         try { 
  43.             SocketService server = new SocketService(); // 啟動服務端 
  44.             server.load(); 
  45.         } catch (Exception e) { 
  46.             e.printStackTrace(); 
  47.         } 
  48.     } 
  49. /** 
  50.  * 處理客戶端傳輸過來的文件線程類 
  51.  */ 
  52. public class Task implements Runnable { 
  53.   @Override 
  54.     public void run() { 
  55.         System.out.println("===客戶端連接成功====="); 
  56.  
  57.         System.out.println("****************************************************************"); 
  58.         SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
  59.         /** 
  60.          * 轉換要求的格式 
  61.          */ 
  62.         try { 
  63.  
  64.             /********************************讀取文件信息********************************/ 
  65.             dis = new DataInputStream(socket.getInputStream()); 
  66.             // 文件名和長度 
  67.             String fileName = dis.readUTF();//1、文件名字 
  68.             long fileLength = dis.readLong();//2、長度 
  69.             String toext = dis.readUTF();//3、擴展名 
  70.             String taskType=dis.readUTF();//4、文件操作類型 
  71.             System.out.println("針對文件的操作類型====="+taskType); 
  72.             String valueObject=dis.readUTF();//5、替換書簽的值 
  73.             System.out.println(format.format(new Date())+":開始接收文件"); 
  74.             ByteArrayOutputStream bos = new ByteArrayOutputStream((int)fileLength); 
  75.             byte[] bytes = new byte[1024]; 
  76.             int length = 0; 
  77.             while((length = dis.read(bytes, 0, bytes.length)) != -1) { 
  78.                 bos.write(bytes, 0, length); 
  79.             } 
  80.             byte[] filebytes = bos.toByteArray(); 
  81.             System.out.println("原始文件大小====="+fileLength+",實際接收文件大小="+filebytes.length); 
  82.  
  83.             /********************************讀取文件信息結束********************************/ 
  84.  
  85.             dos = new DataOutputStream(socket.getOutputStream()); 
  86.  
  87.             /********************************校驗文件信息********************************/ 
  88.             boolean process=true
  89.             if(fileLength>0){ 
  90.             }else
  91.                 dos.writeUTF("error"); 
  92.                 dos.flush(); 
  93.  
  94.                 dos.writeUTF("文件沒有任何內容,請重新傳送"); 
  95.                 dos.flush(); 
  96.                 process=false
  97.             } 
  98.             if(filebytes.length!=fileLength){ 
  99.                 dos.writeUTF("error"); 
  100.                 dos.flush(); 
  101.  
  102.                 dos.writeUTF("接受文件與實際文件大小不符合,請重新傳送文件"); 
  103.                 dos.flush(); 
  104.                 process=false
  105.             } 
  106.             /********************************校驗文件信息結束********************************/ 
  107.  
  108.             /********************************處理文件********************************/ 
  109.             if(process){ 
  110.                 byte[] fileBytes=null
  111.                  
  112.                 this.wordUtil.openFile(filebytes,fileName);//打開院文件 
  113.                 //workbook =workbooks.createWorkbookFromByteArray(filebytes,fileName); 
  114.                 String lowerExt = toext.toLowerCase(); 
  115.                 if("convertFile".equals(taskType)){ 
  116.                     System.out.println("開始將文件["+fileName+"]轉換成===="+lowerExt); 
  117.                     fileBytes=this.wordUtil.convertFile(lowerExt); 
  118.                     System.out.println(format.format(new Date())+":轉換"+toext+"完成"); 
  119.                 }else if("replaceBookMark".equals(taskType)){ 
  120.                     System.out.println("開始將文件["+fileName+"]書簽進行替換===="); 
  121.                     JSONObject jsonObject = JSONObject.fromObject(valueObject); 
  122.                     this.wordUtil.replaceBookMark(jsonObject); 
  123.                     fileBytes = this.wordUtil.convertFile(lowerExt); 
  124.                     System.out.println("===============替換書簽完成============"); 
  125.                 }else if("exportTask".equals(taskType)) {//處理業務數據 導出任務數據 
  126.                     System.out.println("開始導出業務數據===="+valueObject); 
  127.                     ServiceUtil serviceUtil = new ServiceUtil(this.wordUtil); 
  128.                     JSONObject jsonObject = JSONObject.fromObject(valueObject); 
  129.                     fileBytes = serviceUtil.exportData2File(jsonObject.getJSONArray("datalist"), jsonObject.getInt("size")); 
  130.                      System.out.println("===============導出業務數據完成============"); 
  131.                 } 
  132.                  
  133.                  
  134.                 /********************************處理文件結束********************************/ 
  135.                 if(fileBytes==null){ 
  136.                     dos.writeUTF("error"); 
  137.                     dos.flush(); 
  138.                     dos.writeUTF("處理文件過程中錯誤"); 
  139.                     dos.flush(); 
  140.                     process=false
  141.                 } 
  142.  
  143.  
  144.                 /********************************返回處理過的文件********************************/ 
  145.                 if(process){ 
  146.                     dos.writeUTF("info");//文件處理完成,將信息返回到客戶端 
  147.                     dos.flush(); 
  148.                     int fileBytelength = fileBytes.length;//轉換后的文件長度 
  149.                     System.out.println(format.format(new Date())+":======== 服務端開始發送文件流,文件大小("+getFormatFileSize(fileBytelength)+") ========"); 
  150.                     dos.writeLong(fileBytelength); 
  151.                     dos.flush(); 
  152.                     dos.write(fileBytes, 0, fileBytelength);//將文件一起寫入到輸出流發送 
  153.                     dos.flush(); 
  154.                     System.out.println(format.format(new Date())+":======== 發送文件流成功 ========"); 
  155.                 } 
  156.                 /********************************返回處理過的文件完成********************************/ 
  157.  
  158.             } 
  159.         } catch (Exception e) { 
  160.             String error = e.toString(); 
  161.             System.out.println("error==================="+error); 
  162.             StackTraceElement[] stackTrace = e.getStackTrace(); 
  163.             for(StackTraceElement s:stackTrace){ 
  164.                 int lineNumber = s.getLineNumber(); 
  165.                 String methodName = s.getMethodName(); 
  166.                 String className = s.getClassName(); 
  167.                 String filename = s.getFileName(); 
  168.                 System.out.print("err:"+filename+"  "+className+"  "+methodName+"  "+lineNumber); 
  169.                 System.out.println(""); 
  170.             } 
  171.             try { 
  172.                 dos.writeUTF("error"); 
  173.                 dos.flush(); 
  174.                 dos.writeUTF("處理文件過程中錯誤=="+e.toString()); 
  175.                 dos.flush(); 
  176.             }catch (Exception ex){ 
  177.                 String exrror =ex.toString(); 
  178.                 System.out.println("返回數據處理錯誤信息==================="+exrror); 
  179.             } 
  180.  
  181.         }finally { 
  182.             System.out.println("關閉資源"); 
  183.             try { 
  184.                 if(wordUtil!=null)wordUtil.close(); 
  185.                 socket.close(); 
  186.             } catch (Exception e) { 
  187.                 String error = e.toString(); 
  188.                 System.out.println(error); 
  189.                 e.printStackTrace(); 
  190.             } 
  191.             System.out.println("****************************************************************"); 
  192.         } 
  193.  
  194.  
  195. /** 
  196.  * 文件傳輸Clinet端<br> 
  197.  * 功能說明: 
  198.  * @Author 空中智囊 
  199.  * @Date 2016年09月01日 
  200.  * @version 1.0 
  201.  */ 
  202. public class SocketClient extends Socket { 
  203.     public static final Logger LOGGER = LoggerFactory.getLogger(SocketClient.class); 
  204.  
  205.     private static final String SERVER_IP = "127.0.0.1"; // word文件組件處理服務IP地址 
  206.     private static final int SERVER_PORT = 8899;    // word文件組件處理服務端口 
  207.     private int soTimeout = 60000;  // 服務鏈接超時時間 60s 
  208.     private Socket client = this; 
  209.     private FileInputStream fis; 
  210.     private DataOutputStream dos; 
  211.     private DataInputStream dis; 
  212.     private FileOutputStream fos; 
  213.  
  214.     public SocketClient(String listenip, int listenport) throws Exception { 
  215.         super(listenip, listenport); 
  216.         this.setSoTimeout(this.soTimeout); 
  217.         LOGGER.info("Cliect[port:" + this.client.getLocalPort() + "] 成功連接服務端"); 
  218.     } 
  219.  
  220.     public SocketClient() throws Exception { 
  221.         super(SERVER_IP, SERVER_PORT); 
  222.         this.setSoTimeout(this.soTimeout); 
  223.         LOGGER.info("Cliect[port:" + this.client.getLocalPort() + "] 成功連接服務端"); 
  224.     } 
  225.  
  226.     public SocketClient(String listenip, int listenport, int soTimeout) throws Exception { 
  227.         super(listenip, listenport); 
  228.         this.setSoTimeout(soTimeout); 
  229.         LOGGER.info("Cliect[port:" + this.client.getLocalPort() + "] 成功連接服務端"); 
  230.     } 
  231.  
  232.     /** 
  233.      * 處理word文件 
  234.      * @param srcRealPath   模板word文件路徑絕對地址 
  235.      * @param descRealPath  處理后的文件存放地址絕對路徑 
  236.      * @param taskType      處理文件的類型 convertFile/replaceBookMark/exportTask  
  237.      * @param jsonObject    傳給服務端的數據對象,這個參數可根據服務端需求進行調整 
  238.      * @return  處理結果 
  239.      */ 
  240. public JSONObject processOffice(String srcRealPath, String descRealPath, String taskType, JSONObject jsonObject) { 
  241.         JSONObject rtnObject = new JSONObject(); 
  242.         String code = "200"
  243.         String message = ""
  244.  
  245.         try { 
  246.             File file = new File(srcRealPath); 
  247.             if (!file.exists() || !file.canWrite()) { 
  248.                 code = "200"
  249.                 message = "文件不存在,或已被占用"
  250.                 rtnObject.element("code", code); 
  251.                 rtnObject.element("message", message); 
  252.                 JSONObject var41 = rtnObject; 
  253.                 return var41; 
  254.             } 
  255.  
  256.             LOGGER.info(srcRealPath + "===>" + descRealPath); 
  257.             if (file.exists() && file.canWrite()) { 
  258.                 String filename = file.getName(); 
  259.                 this.fis = new FileInputStream(file); 
  260.                 this.dos = new DataOutputStream(this.client.getOutputStream()); 
  261.                 this.dos.writeUTF(filename);//文件名字 
  262.                 this.dos.flush(); 
  263.                 this.dos.writeLong(file.length());//文件長度 
  264.                 this.dos.flush(); 
  265.                 String ext = descRealPath.substring(descRealPath.lastIndexOf(".") + 1, descRealPath.length()); 
  266.                 this.dos.writeUTF(ext);//源文件后綴名字 
  267.                 this.dos.flush(); 
  268.                 this.dos.writeUTF(taskType);//任務類型 
  269.                 this.dos.flush(); 
  270.                 if (YOZOOfficeUtil.PROCESS_TYPE_CONVERTFILE.equals(taskType)) { 
  271.                     this.dos.writeUTF(jsonObject.toString()); 
  272.                     this.dos.flush(); 
  273.                 } 
  274.  
  275.                 LOGGER.info("======== 開始向服務端傳送源文件" + srcRealPath + " ========"); 
  276.                 byte[] bytes = new byte[1024]; 
  277.                 long progress = 0L; 
  278.  
  279.                 int length; 
  280.                 while((length = this.fis.read(bytes, 0, bytes.length)) != -1) { 
  281.                     this.dos.write(bytes, 0, length); 
  282.                     this.dos.flush(); 
  283.                     progress += (long)length; 
  284.                     LOGGER.info("| " + 100L * progress / file.length() + "% |"); 
  285.                 } 
  286.  
  287.                 LOGGER.info("======== 文件傳輸成功 (" + file.length() / 1048576L + ")M========"); 
  288.                 this.client.shutdownOutput(); 
  289.                 LOGGER.info("======== 開始轉換" + ext + " ========"); 
  290.                 InputStream inputStream = this.client.getInputStream(); 
  291.                 this.dis = new DataInputStream(inputStream); 
  292.                 String result = this.dis.readUTF(); 
  293.                 if ("error".equals(result)) { 
  294.                     String reason = this.dis.readUTF(); 
  295.                     LOGGER.info(reason); 
  296.                     code = "500"
  297.                     message = reason; 
  298.                 } else if ("info".equals(result)) { 
  299.                     long l = this.dis.readLong(); 
  300.                     LOGGER.info("======== 轉換" + ext + "完成,文件大小(" + l / 1048576L + ")M ========"); 
  301.                     LOGGER.info("======== 開始接受" + ext + " ========"); 
  302.                     File newFile = new File(descRealPath); 
  303.                     if (newFile.exists()) { 
  304.                         newFile.delete(); 
  305.                     } 
  306.  
  307.                     this.fos = new FileOutputStream(newFile); 
  308.                     progress = 0L; 
  309.                     bytes = new byte[1048576]; 
  310.  
  311.                     while((length = this.dis.read(bytes, 0, bytes.length)) != -1) { 
  312.                         this.fos.write(bytes, 0, length); 
  313.                         this.fos.flush(); 
  314.                     } 
  315.  
  316.                     LOGGER.info("======== 接受" + ext + "文件成功========"); 
  317.                     this.dis.close(); 
  318.                 } else { 
  319.                     code = "500"
  320.                     message = "鏈接被強制關閉...."
  321.                 } 
  322.             } else { 
  323.                 code = "404"
  324.                 message = "文件不存在,或已被占用:" + srcRealPath; 
  325.             } 
  326.         } catch (Exception e) { 
  327.             code = "500"
  328.             message = "客戶端報錯:" + e.toString(); 
  329.             LOGGER.error("異常:",e); 
  330.  
  331.         } finally { 
  332.             if (this.fis != null) { 
  333.                 try { 
  334.                     this.fis.close(); 
  335.                 } catch (Exception var38) { 
  336.                     ; 
  337.                 } 
  338.             } 
  339.  
  340.             if (this.fos != null) { 
  341.                 try { 
  342.                     this.fos.close(); 
  343.                 } catch (Exception var37) { 
  344.                     ; 
  345.                 } 
  346.             } 
  347.  
  348.             try { 
  349.                 this.client.close(); 
  350.             } catch (Exception var36) { 
  351.                 ; 
  352.             } 
  353.  
  354.         } 
  355.  
  356.         rtnObject.element("code", code); 
  357.         rtnObject.element("message", message); 
  358.         return rtnObject; 
  359.     } 
  360.  
  361.     public static void main(String[] args) { 
  362.         try { 
  363.             SocketClient socketClient = new SocketClient(); 
  364.             // 將文檔轉換成pdf文件 
  365.             socketClient.processOffice("D:/2.doc","D:/2.pdf",YOZOOfficeUtil.PROCESS_TYPE_CONVERTFILE,null); 
  366.  
  367.             // 將文檔轉換成pdf文件 
  368.             JSONObject dataObject = new JSONObject(); 
  369.             dataObject.element("bookmarkname","這個是測試呢日哦那個"); 
  370.             socketClient.processOffice("D:/2.doc","D:/2.pdf",YOZOOfficeUtil.PROCESS_TYPE_REPLACEBOOKMARK,dataObject); 
  371.         } catch (Exception e) { 
  372.             LOGGER.error("異常:",e); 
  373.  
  374.         } 
  375.  
  376.     } 

5、啟動word文件處理組件服務端 

服務端WORD文件模板書簽替換、轉換文件類型的另類實現(源碼)
組件啟動腳本

nohup ./ofdServer.sh &

6、調用服務端對word文件處理 

  1. public static void main(String[] args) { 
  2.         try { 
  3.             SocketClient socketClient = new SocketClient(); 
  4.             // 將文檔轉換成pdf文件 
  5.             socketClient.processOffice("D:/2.doc","D:/2.pdf",YOZOOfficeUtil.PROCESS_TYPE_CONVERTFILE,null); 
  6.  
  7.             // 替換模板中的書簽值,word中插入書簽自行百度 
  8.             JSONObject dataObject = new JSONObject(); 
  9.             dataObject.element("bookmarkname","這個是測試呢日哦那個"); 
  10.             socketClient.processOffice("D:/2.doc","D:/3.doc",YOZOOfficeUtil.PROCESS_TYPE_REPLACEBOOKMARK,dataObject); 
  11.         } catch (Exception e) { 
  12.             LOGGER.error("異常:",e); 
  13.  
  14.         } 
  15.  
  16.     } 

7、資源下載

word文件處理組件服務端(開箱即用):

鏈接:https://pan.baidu.com/s/1_ZgjoX_nuv3a7_SKkJ_D7w 提取碼: hn2r 

 服務端資源內容 

將文件復制到linux服務器,并解壓,執行 ./ofdServer.sh ,輸出:服務端啟動,監聽端口為:8899,即運行成功

word文件處理組件客戶端(開箱即用processOffice):

鏈接:https://pan.baidu.com/s/1mtabGY87RuAGGkwKrBIvfQ 提取碼: mqxf 


客戶端資源文件內容 

將源文件復制到項目指定包名,運行SocketClient.java中的main方法,可查看運行結果。

最重要的一點:服務器要安裝永中OFFICE客戶端

 

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2009-11-16 12:17:46

PHP上傳文件類型

2023-11-03 18:09:31

sed文件屬性

2009-09-11 08:47:03

Linux系統批量替換文件Linux

2010-03-10 09:27:36

Linux鏈接文件類型

2010-01-05 15:32:33

2010-03-01 15:34:38

Linux文件類型

2012-05-21 23:43:31

Java

2009-10-21 10:50:59

Linux文件類型

2010-01-12 11:37:06

Linux常見文件

2009-11-09 13:31:09

WCF服務端配置

2009-07-24 10:23:07

WORD文件轉換PDFASP.NET

2010-04-02 13:15:01

Oracle跟蹤

2010-05-21 10:02:56

2011-06-01 10:48:28

Android系統

2009-08-12 16:44:13

.NET文件類型

2017-06-09 06:14:41

2011-05-25 16:44:01

JavaScriptCSS

2021-02-05 08:03:52

Java

2019-04-12 14:26:17

Linux命令文件

2010-02-24 15:42:03

WCF服務端安全
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄色三级免费 | 欧美激情精品久久久久久免费 | 中文字幕一区二区三区不卡在线 | 黄色国产 | 日本精品视频在线观看 | 欧美日韩高清在线观看 | 在线视频一区二区三区 | 国产91网站在线观看 | 免费看啪啪网站 | 婷婷激情综合 | 亚洲一区视频在线 | 久久青青 | 国产91丝袜在线播放 | 成人在线观 | 亚洲成av片人久久久 | 久久久久久久久久影视 | 成人美女免费网站视频 | 日韩精品久久久久久 | 久久与欧美 | 一级欧美 | 中文字幕国产一区 | 一级欧美 | 国产精品自产拍在线观看蜜 | 国产精品99久久久久久人 | 黄色网址免费看 | 日日噜| 久久久久久国产精品 | 亚洲精品一区二区三区蜜桃久 | 精品亚洲永久免费精品 | 欧美日韩在线免费观看 | 午夜极品 | 99国产精品久久久 | 免费永久av | 男女精品久久 | 亚洲精品乱码久久久久v最新版 | 91久久婷婷 | 日韩av免费在线电影 | 国产高清久久久 | 美女艹b| 亚洲国产精品久久人人爱 | 亚洲国产成人在线视频 |