引言: 

最近项目中对上传的文件需要在线查看功能(就是不用下载到本地,可以直接在网页里打开的查看),通过几周的研究终于搞定,在此总结下供有同样需求的同仁查询和使用。

原理:

通常的在线查看功能都是使用文档转换工具,把原始文档转换成swf文档,然后通过网页直接展示文档内容。

解决方案:

在前期技术研究的过程中,发现有三种解决方案,他们分别是:

1、使用 FlexPaper + Pdf2swf 组合。 

缺点是只能提供pdf转换成swf然后在线查看。要支持其他格式的话,需要先转成pdf,这样的话效率有点低。不过网上这种方式的资料挺多的。

相关资料: www.cnblogs.com/luckyxiaoxuan/archive/2012/06/13/2548510.html

2、使用FlashPaper 把文档转成swf直接显示

这种方式的好处在于支持多种格式的文档转换,支持的文档格式包括(doc、docx、xls、xlsx、pdf、txt, ppt、pptx), ppt、pptx的支持效果不怎么好,转换有些慢,要支持这两种方式的话,有专有的转换工具。

原来准备使用FlashPaper转换成swf文档,然后使用FlexPaper显示的,但是发现使用FlexPaper显示FlashPaper转成的swf存在问题,不能显示swf内容,而且不停的闪。后来想起浏览器可以直接支持swf显示的。使用<object><embed>标签即可。

还有一个好处就是这个工具免费。

缺点就是: 最后版本2.2,发布于2008年5月,此后不再支持;支持winxp, server2003等,不支持win7系统;

3、使用Print2Flash把文档转换成swf直接显示

这个东西比FlashPaper更强大,功能更全面,而且提供各种系统的支持。是一个非常不错的工具。

缺点就是:需要money,有需求的公司可以使用。

相关资料: http://www.blue-pacific.com/print2flash/samples/default.htm

我的方案:

我选用的第二种方案,免费,而且对各种当前流行的文档都支持,同时服务器是window server 2003。下面说下具体的程序吧。

1、FlashPaper的安装

可以在网上下载 FlashPaper2.2绿色版,地址: http://download.csdn.net/detail/walkerjong/4420486

下载安装程序后,可以点击install.bat安装FlashPaper,若出现下面的错误:

flashpaper AddPrinterDriver stage 13: error 126 - 找不到指定的模块

错误原因: 安装操作系统的时候没有开启系统还原功能,FlashPaper需要使用该功能。

解决方案: 把安装文件包里的srclient.dll文件拷贝到c:/windows/system32/目录下。

当然也可以使用java程序自动安装,下面是我的工具类代码:FlashPaperUtil.java

[java]  view plain copy

  1. packageorg.study.isap.common.util;
  2. importjava.io.BufferedReader;
  3. importjava.io.File;
  4. importjava.io.FileNotFoundException;
  5. importjava.io.IOException;
  6. importjava.io.InputStream;
  7. importjava.io.InputStreamReader;
  8. importorg.apache.log4j.Logger;
  9. publicclassFlashPaperUtil {
  10. privatestaticfinalLogger logger = Logger.getLogger(FlashPaperUtil.class);
  11. // flashPaper的存放位置
  12. publicstaticfinalString FLASH_PAPER_DIR ="bin/flashPaper2_2";
  13. // 转换各种格式的文档为swf的命令
  14. publicstaticfinalString FLASH_PAPER_CMD ="FlashPrinter.exe";
  15. // 检查swf是否转换完成的最大等待次数
  16. privatestaticfinalintmaxWaitCount =60;
  17. // 检查swf是否存在的时间间隔, 单位ms。
  18. privatestaticfinalintcheckInterval =20000;
  19. privatestaticfinalFile flashPaperDir = initDir();
  20. privateFlashPaperUtil(){
  21. }
  22. privatestaticFile initDir(){
  23. File dir = newFile(FileUtil.getWebRootPath(), FLASH_PAPER_DIR);
  24. logger.debug("flashPaperDir["+dir.getAbsolutePath()+"]");
  25. returndir;
  26. }
  27. /**
  28. * 卸载flashPaper。
  29. */
  30. publicstaticvoiduninstall(){
  31. String uninstallCmd = "uninstall.bat";
  32. try{
  33. String cmd =newFile(flashPaperDir, uninstallCmd).getAbsolutePath();
  34. Runtime runtime = Runtime.getRuntime();
  35. Process process = runtime.exec(cmd, null, flashPaperDir);
  36. try{
  37. // 读取process输出流,放置buffer过小阻塞
  38. InputStream infoStream = process.getInputStream();
  39. newReadThread(infoStream).start();
  40. InputStream errorStream = process.getErrorStream();
  41. newReadThread(errorStream).start();
  42. process.waitFor();
  43. catch(InterruptedException e) {
  44. logger.error(e);
  45. }finally{
  46. process.destroy();
  47. }
  48. runtime = null;
  49. logger.info("卸载FlashPaper成功,cmd["+cmd+"]");
  50. catch(IOException e) {
  51. logger.error(e);
  52. logger.error("卸载FlashPaper时出现错误。");
  53. }
  54. }
  55. /**
  56. * 安装flashPaper。
  57. */
  58. publicstaticvoidinstall(){
  59. String installCmd = "install.bat";
  60. if(checkInstallEnvironment()){
  61. try{
  62. String cmd =newFile(flashPaperDir, installCmd).getAbsolutePath();
  63. Runtime runtime = Runtime.getRuntime();
  64. Process process = runtime.exec(cmd, null, flashPaperDir);
  65. try{
  66. // 读取process输出流,放置buffer过小阻塞
  67. InputStream infoStream = process.getInputStream();
  68. newReadThread(infoStream).start();
  69. InputStream errorStream = process.getErrorStream();
  70. newReadThread(errorStream).start();
  71. process.waitFor();
  72. catch(InterruptedException e) {
  73. logger.error(e);
  74. }finally{
  75. process.destroy();
  76. }
  77. runtime = null;
  78. logger.info("安装FlashPaper成功,cmd["+cmd+"]");
  79. catch(IOException e) {
  80. logger.error(e);
  81. logger.error("安装FlashPaper时出现错误。");
  82. }
  83. }
  84. }
  85. 便民养生网站长提供:http://www.yangsheng52.com/
  86. /**
  87. * 检查安装flashPaper的环境。
  88. * @return
  89. */
  90. privatestaticbooleancheckInstallEnvironment(){
  91. String systemRoot = System.getenv("SystemRoot");
  92. File dest = newFile(systemRoot,"system32/srclient.dll");
  93. logger.debug("操作系统安装路径["+systemRoot+"]");
  94. if(!dest.exists()){
  95. logger.info("系统安装目录下不存在该文件["+dest.getAbsolutePath()+"],程序将自动复制该文件。");
  96. String srcFile = "srclient.dll";
  97. try{
  98. File src = newFile(flashPaperDir, srcFile);
  99. FileUtil.copyFile(src, dest);
  100. returntrue;
  101. catch(FileNotFoundException e) {
  102. logger.error("找不到要拷贝的源文件["+srcFile+"]", e);
  103. catch(IOException e) {
  104. logger.error("复制文件出错, 源文件["+srcFile+"], 目标文件["+dest.getAbsolutePath()+"]", e);
  105. }
  106. logger.error("您的环境不能自动安装FlashPaPer,需要手动安装,安装程序位置/WEB-INF/classes/"+FLASH_PAPER_DIR);
  107. returnfalse;
  108. }else{
  109. logger.info("系统安装目录下存在该文件["+dest.getAbsolutePath()+"],FlashPaper可以开始安装。");
  110. returntrue;
  111. }
  112. }
  113. /**
  114. * 使用flashpaper将文档格式转换生产swf文件。
  115. * 支持格式: office(word、excel),pdf, txt等主流格式。
  116. * @param path
  117. * @return
  118. */
  119. publicstaticFile fileToSwf(String input, String output){
  120. File inputFile = newFile(input);
  121. File outputFile = newFile(output);
  122. returnfileToSwf(inputFile, outputFile);
  123. }
  124. /**
  125. * 使用flashpaper将文档格式转换生产swf文件。
  126. * 支持格式: office(word、excel),pdf, txt等主流格式。
  127. * @param path
  128. * @return
  129. */
  130. publicstaticFile fileToSwf(File input, File output){
  131. returnfileToSwf(input, output,true);
  132. }
  133. publicstaticFile fileToSwf(File input, File output,booleanwaitFinished){
  134. if(input ==null|| !input.exists()){
  135. logger.error("要转换为swf的文件["+input.getAbsolutePath()+"]为空或不存在!");
  136. returnnull;
  137. }
  138. if(output.exists()){
  139. logger.info("swf["+output+"]已经存在。");
  140. returnoutput;
  141. }
  142. String printerCmd = newFile(flashPaperDir, FLASH_PAPER_CMD).getAbsolutePath();
  143. String cmd = printerCmd+" "+input.getAbsolutePath()+" -o "+output.getAbsolutePath();
  144. logger.debug("fileToSwf cmd["+cmd+"]");
  145. intresultCode =1;
  146. try{
  147. Process process = Runtime.getRuntime().exec(cmd, null, flashPaperDir);
  148. try{
  149. // 读取process输出流,系统提供的buffer过小不读取会阻塞
  150. newReadThread(process.getInputStream()).start();
  151. newReadThread(process.getErrorStream()).start();
  152. resultCode = process.waitFor();
  153. if(resultCode ==1){
  154. logger.error("转换文件过程中出现错误,请检查FlashPaper环境是否安装正确!");
  155. }
  156. catch(InterruptedException e) {
  157. logger.error(e);
  158. }finally{
  159. process.destroy();
  160. }
  161. if(resultCode !=1&& waitFinished){
  162. for(intcount=maxWaitCount; count>=0; count--){
  163. if(output.exists()){
  164. logger.info("转换文档为swf成功,swf["+output.getAbsolutePath()+"]");
  165. break;
  166. }else{
  167. try{// 休眠checkInterval秒后检查swf文件是否转换完成
  168. Thread.sleep(checkInterval);
  169. catch(InterruptedException e) {
  170. logger.error(e);
  171. }
  172. }
  173. }
  174. }
  175. catch(IOException e) {
  176. logger.error("转换文档为swf失败, path["+input.getAbsolutePath()+"]", e);
  177. }
  178. returnoutput;
  179. }
  180. privatestaticclassReadThreadextendsThread {
  181. privateInputStream inputStream;
  182. publicReadThread(InputStream inputStream){
  183. this.inputStream = inputStream;
  184. }
  185. publicvoidrun(){
  186. BufferedReader input = null;
  187. String str = null;
  188. try{
  189. input = newBufferedReader(newInputStreamReader(this.inputStream,"GBK"));
  190. while( (str=input.readLine())!=null){
  191. logger.debug(str);
  192. }
  193. catch(IOException e) {
  194. logger.error("读取执行线程信息时出错", e);
  195. }finally{
  196. try{
  197. input.close();
  198. this.inputStream =null;
  199. catch(IOException e) {
  200. logger.error(e);
  201. }
  202. }
  203. }
  204. }
  205. }

另外,为了方便程序部署,我们写了一个自动安装程序。

FlashPaperInstallService.java

[java]  view plain copy

  1. packageorg.study.isap.common.service;
  2. importorg.springframework.stereotype.Service;
  3. importcom.cosbulk.isap.common.util.FlashPaperUtil;
  4. @Service
  5. publicclassFlashPaperInstallService {
  6. publicFlashPaperInstallService(){
  7. Thread thread = newInstallThread();
  8. thread.start();
  9. }
  10. privatestaticclassInstallThreadextendsThread {
  11. publicInstallThread(){
  12. setName("[Install FlashPaper Thread]");
  13. setDaemon(true);
  14. }
  15. publicvoidrun(){
  16. FlashPaperUtil.uninstall();
  17. FlashPaperUtil.install();
  18. }
  19. }
  20. }

FileUtil.java 文件如下:

[java]  view plain copy

  1. packageorg.study.isap.common.util;
  2. importjava.io.BufferedInputStream;
  3. importjava.io.BufferedOutputStream;
  4. importjava.io.File;
  5. importjava.io.FileInputStream;
  6. importjava.io.FileOutputStream;
  7. importjava.io.IOException;
  8. importjava.io.InputStream;
  9. importjava.io.OutputStream;
  10. importjava.io.UnsupportedEncodingException;
  11. importjava.net.URLDecoder;
  12. importjavax.servlet.http.HttpServletRequest;
  13. importorg.apache.log4j.Logger;
  14. importorg.springframework.util.StringUtils;
  15. publicclassFileUtil {
  16. privatestaticfinalLogger logger = Logger.getLogger(FileUtil.class);
  17. // web工程的文件系统根目录 (/**/isap)
  18. privatestaticfinalString webRootPath;
  19. // web工程的URL根目录 (http://***.**/isap)
  20. privatestaticString webRootUrl;
  21. static{
  22. webRootPath = initWebFileBase();
  23. webRootUrl = null;
  24. }
  25. privateFileUtil(){
  26. }
  27. privatestaticString initWebFileBase(){
  28. String fileBase = null;
  29. String path = FlashPaperUtil.class.getClassLoader().getResource("").getFile();
  30. // 获取的文件路径为url地址编码,需要处理空格问题
  31. String classPath = path;
  32. try{
  33. classPath = URLDecoder.decode(path, "UTF-8");
  34. catch(UnsupportedEncodingException e) {
  35. logger.error(e);
  36. }
  37. intindex = classPath.lastIndexOf("/WEB-INF/classes");
  38. if(index != -1){
  39. fileBase = classPath.substring(0, index);
  40. logger.debug("获取isap文件系统根路径成功, webFileBase["+fileBase+"]");
  41. }else{
  42. index = classPath.lastIndexOf("/build/classes");
  43. if(index != -1){
  44. fileBase = classPath.substring(0, index)+"/WebRoot";
  45. }else{
  46. fileBase="";
  47. logger.error("获取isap文件系统根路径错误。path["+classPath+"]");
  48. }
  49. }
  50. returnfileBase;
  51. }
  52. //------------------ 路径相关 -----------------
  53. /**
  54. * 返回web工程的文件系统的绝对路径。
  55. * @return
  56. */
  57. publicstaticString getWebRootPath(){
  58. returnwebRootPath;
  59. }
  60. /**
  61. * 把相对webFileBase的path转换成url形式的字符串。
  62. * 例如:<br/>
  63. * 输入: /uploadFiles/project/file/test.doc <br/>
  64. * 输出:http://127.0.0.1:8080/isap/uploadFiles/project/file/test.doc <br/>
  65. * @param request
  66. * @param path
  67. * @return
  68. */
  69. publicstaticString getDocUrl(HttpServletRequest request, String path){
  70. if(!StringUtils.hasLength(webRootUrl)){
  71. webRootUrl = request.getScheme()+"://"+request.getLocalAddr()+":"+request.getLocalPort()+request.getContextPath();
  72. }
  73. if(StringUtils.hasLength(path)){
  74. if(path.startsWith("http://")){
  75. returnpath;
  76. }
  77. path = path.replace('\\', '/');
  78. }else{
  79. returnwebRootUrl;
  80. }
  81. if(!path.startsWith("/")){
  82. returnwebRootUrl+"/"+path;
  83. }
  84. returnwebRootUrl+path;
  85. }
  86. // ----------------------- 文件名和文件类型相关 ----------------
  87. /**
  88. * 获取文件名称。
  89. */
  90. publicstaticString getFileName(String docUrl){
  91. intindex = docUrl.lastIndexOf("/");
  92. if(index != -1){
  93. returndocUrl.substring(index+1);
  94. }else{
  95. returndocUrl;
  96. }
  97. }
  98. /**
  99. * 获取文件类型, 返回带点号的文件类型。例如“.doc”
  100. *
  101. * @param docUrl
  102. * @return
  103. */
  104. publicstaticString getFileType(String docUrl){
  105. intindex = docUrl.lastIndexOf(".");
  106. if(index != -1){
  107. returndocUrl.substring(index);
  108. }else{
  109. returndocUrl;
  110. }
  111. }
  112. /**
  113. * 获得输入路径下,同名文件的swf文件。 <br />
  114. *
  115. * @param path
  116. * @param fileType
  117. * @return
  118. */
  119. publicstaticString getSwfFile(String path){
  120. String swfPath = null;
  121. if(StringUtils.hasLength(path)){
  122. intindex = path.lastIndexOf(".");
  123. if(index != -1){
  124. swfPath = path.substring(0, index)+".swf";
  125. }
  126. }
  127. returnswfPath;
  128. }
  129. publicstaticFile getSwfFile(File file) {
  130. String swfpath = getSwfFile(file.getAbsolutePath());
  131. returnnewFile(swfpath);
  132. }
  133. // ---------- 复制文件 ---------
  134. publicstaticvoidcopyFile(File src, File dest)throwsIOException{
  135. File dir = dest.getParentFile();
  136. if(!dir.exists()){
  137. dir.mkdirs();
  138. }
  139. BufferedInputStream input = null;
  140. BufferedOutputStream output = null;
  141. try{
  142. input = newBufferedInputStream(newFileInputStream(src));
  143. output = newBufferedOutputStream(newFileOutputStream(dest));
  144. intlength =0;
  145. byte[] buffer =newbyte[4*1024];
  146. while((length = input.read(buffer)) >=0){
  147. output.write(buffer, 0, length);
  148. }
  149. }finally{
  150. FileUtil.closeOutputStream(output);
  151. FileUtil.closeInputStream(input);
  152. }
  153. }
  154. // ------------- 关闭文件流 --------------------
  155. /**
  156. * 关闭输入流。
  157. * @param input
  158. */
  159. publicstaticvoidcloseInputStream(InputStream input){
  160. if(input !=null){
  161. try{
  162. input.close();
  163. catch(IOException e) {
  164. logger.error("关闭输入文件失败!");
  165. logger.error(e);
  166. }
  167. }
  168. }
  169. /**
  170. * 关闭输出流。
  171. * @param output
  172. */
  173. publicstaticvoidcloseOutputStream(OutputStream output){
  174. if(output !=null){
  175. try{
  176. output.close();
  177. catch(IOException e) {
  178. logger.error("关闭输出文件失败!");
  179. logger.error(e);
  180. }
  181. }
  182. }
  183. }

说明: 下载下来的flashPaper安装程序解压后放置在 WebContent/bin/目录下。

程序自动的时候自动安装,若检测到没有使用系统还原功能,自动拷贝文件到系统system32目录下。

2、在上面贴出的代码中,使用FlashPaperUtil. fileToSwf()函数即可完成对可支持文档的转换。即转成swf文件。

3、显示转成成的swf文件。

displaySwf.jsp

[html]  view plain copy

  1. <%@ pagelanguage="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"isELIgnored="false"%>
  2. <%@ taglibprefix="c"uri="/WEB-INF/tld/c.tld"%>
  3. <%
  4. String webRoot=request.getContextPath();
  5. %>
  6. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  7. <html>
  8. <head>
  9. <basehref="<%=webRoot%>/view/common/"/>
  10. <title>在线显示文档</title>
  11. <metahttp-equiv="Content-Type"content="text/html; charset=UTF-8"/>
  12. <styletype="text/css"media="screen">
  13. html,body{
  14. margin: 0px;
  15. padding: 0px;
  16. overflow: hidden;
  17. height: 100%;
  18. }
  19. #content{
  20. width:100%;
  21. height:100%;
  22. MARGIN: 0px auto;
  23. }
  24. </style>
  25. </head>
  26. <body>
  27. <c:iftest="${swfUrl!=null}">
  28. <divid="content">
  29. <object
  30. classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
  31. codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0"
  32. width="100%"
  33. height="100%"
  34. >
  35. <paramname="movie"value="${swfUrl}"/>
  36. <paramname="quality"value="high"/>
  37. <paramname="allowFullScreen"value="true"/>
  38. <embed
  39. pluginspage="http://www.macromedia.com/go/getflashplayer"
  40. type="application/x-shockwave-flash"
  41. src="${swfUrl}"
  42. allowfullscreen="true"
  43. quality="high"
  44. width="100%"
  45. height="100%"
  46. >
  47. </embed>
  48. </object>
  49. </div>
  50. </c:if>
  51. <c:iftest="${swfUrl==null}">
  52. <divclass="box error center"style="width:60%;">
  53. <h1>没有指定要显示的文档路径!</h1>
  54. </div>
  55. </c:if>
  56. </body>
  57. </html>

处理请求的controller类中相关方法:

[java]  view plain copy

  1. /**
  2. * 显示在线文档。
  3. * @return
  4. */
  5. @RequestMapping("show")
  6. publicString show(String swfUrl, HttpServletRequest request){
  7. request.setAttribute("swfUrl", swfUrl);
  8. return"common/displaySwf";
  9. }

请求显示在线文档的url如下:

[html]  view plain copy

  1. http://localhost:8080/isap/fileManage/show.action?swfUrl=http://192.168.1.100/isap_doc/1341818769265.swf

注: 在FlashPaper转各类文档的时候,看到他们相关程序打开了要转的文件,然后转换的。所以碰到问题的时候注意检查一下几点:

1、服务器上是否安装相关文档的打开程序,例如office 2007  --> docx;

2、检查服务器上的Print Spoller服务是否启动,虚拟打印需要用到该服务;

3、还是失败的话,用cmd运行FlashPaper安装程序下的install.bat, 查看错误原因。

ok,至此为止已经完成各种文档的转换和显示问题,希望能有同样需求的同仁们少走弯路。

doc转swf,主流文档在线查看解决方案--类似百度文档功能相关推荐

  1. php 文档在线查看器,Office Web Viewer 在线Office文档查看器API

    您的网站或博客上是否有希望您的读者查看的 Office 文档(即使他们未安装 Office)?您是否更喜欢在下载文档之前查看文档?若要给您的受众提供更好的体验,请试试 Office Web Viewe ...

  2. PageOffice+MobOffice 电脑、移动跨平台Office文档在线流转解决方案

    一直以来,在线办公系统同时支持领导用手机和电脑对Office文档进行审批.盖章,成为了所有开发者无法逾越的难题.卓正软件开发团队历时三年开发了PageOffice 5.0和MobOffice 5.0产 ...

  3. html 文档在线查看,在网页中在线查看文档(doc、docx 、xls 、xlsx、 pdf 、swf )

    步骤一:(涉及到的工具) 步骤二:(配置工程) 1.在项目中导入下载FlexPaper解压后文件(js.css.swf文件等) 2.编写一个html页面 html, body{ height:100% ...

  4. java pdf在线阅读插件_JAVA实现在线查看PDF和office文档

    一个项目中要做一个在线预览附件(和百度文库差不多)的小功能点,楼主在开发过程中踩了很多坑的同时也总结了一些方法,仅供广大猿友参考,那么要实现这个小功能,目前主要是有如下3种可行的实现方式,下面先说实现 ...

  5. 文档在线查看功能的实现

    js验证手机号格式 function isPhone(phone) {var pattern = /^1[34578]\d{9}$/; return pattern.test(phone); } 提交 ...

  6. office 文档 在线查看

    refs: 1)windows平台 office online server安装 https://docs.microsoft.com/zh-cn/officeonlineserver/office- ...

  7. 绘制四叶玫瑰线matlab,数学实验_word文档在线阅读与下载_文档网

    成都学院二零一三到二零一四学年第二学期半期考试 <数学实验>课程考试题 (120分钟) 考试形式:闭卷 考试日期: 年 月 日 所有答案一律写在答题纸上,写在试卷上无效. 一.单项选择题( ...

  8. java实现Word文档(doc、docx)在线查看功能(前台+后台)

    功能需求要求实现文档上传.下载.查看.删除,查看没弄过,别的就不提了,以下是我记录的实现文档在线查看的方法以及效果图 实现思路 首先把word文件转为pdf,然后在用js查看pdf文件实现在线查看功能 ...

  9. php实现word文档在线浏览功能,配置安装手记

    欢迎加入php架构师之旅 群:410028331(招纳贤人-大师中)方便技术的交流 一般类似oa或者crm等管理系统可能都会遇到需要再线查看word文档的功能,类似百度文库. 记得去年小组中的一个成员 ...

最新文章

  1. cppunit linux,Linux中使用CppUnit工具
  2. VMVMware-workstation以及CentOS-7安装
  3. System.ComponentModel.Component : MarshalByRefObject, IComponent, IDisposable
  4. 零膨胀负二项回归模型的使用 R语言
  5. php怎么构造一个验证码,PHP封装一个生成验证码的函数
  6. 关于如何在Android、Java等非微软平台上建立高信任的SharePoint应用程序
  7. payload的使 常用xss_跨站脚本XSS Payloads生成器
  8. 打印Activity任务栈脚本:adb shell dumpsys activity
  9. sqldf包的使用使用-R
  10. PHP的.htaccess作用
  11. Http Simulate
  12. 用计算机表白教程,抖音短视频vbs表白代码使用教程
  13. 面试最后一问:你有什么问题想问我吗?
  14. emwin自定义字库
  15. python——利用正则表达式爬取豆瓣读书中的图书信息
  16. 筷子SaaS智能系统源码-短视频私域流量增长解决方案,出【源码-无限授权】
  17. 《三国群英传2网络版》所有装备掉落查询
  18. 《Java 2 实用教程》课程学习(17)——《Java 程序设计》实验指导书-校内实验教材
  19. Codeforces Gym100543L Outer space invaders 区间dp 动态规划
  20. 关于行为评分卡建模的数据准备

热门文章

  1. 什么是128陷阱?什么是装箱?什么是拆箱?为什么要有包装类?
  2. 第1章 游戏之乐——连连看游戏设计
  3. 生态梯田 “薯”光无限
  4. Error creating bean with name ‘sqlSessionFactory‘ defined in class path reso...报错的解决方法
  5. MogaFX—日元兑美元30多年来首次突破150日元
  6. Unity3D RenderTexture实现3D立绘
  7. Excel VBA ListBox列表框学习
  8. 6.汇编语言显示、指令
  9. 中兴ZXQ10排队机出现问题了...
  10. CAD中怎么绘制攒尖屋顶?CAD设计攒尖屋顶技巧