当前位置: 代码迷 >> HTML/CSS >> 自动上载HTML中的非本map片,并替换内容
  详细解决方案

自动上载HTML中的非本map片,并替换内容

热度:211   发布时间:2012-12-22 12:05:07.0
自动下载HTML中的非本地图片,并替换内容

转载的时候,文章中有图片,但是因为很多网站会做防盗链处理,使得在阅读文章时图片无法显示。
解决的办法,发文章时程序自动解析出文章中所有的图片,并下载到本地,然后将图片的URL地址改为本地地址。

下面是详细代码:
?

折叠?Java 代码复制内容到剪贴板
  1. package?net.oschina.utils; ??
  2. ??
  3. import?java.io.File; ??
  4. import?java.io.FileOutputStream; ??
  5. import?java.io.IOException; ??
  6. import?java.io.InputStream; ??
  7. import?java.net.HttpURLConnection; ??
  8. import?java.net.MalformedURLException; ??
  9. import?java.net.URL; ??
  10. import?java.text.SimpleDateFormat; ??
  11. import?java.util.Date; ??
  12. import?java.util.HashMap; ??
  13. ??
  14. import?org.apache.commons.io.FilenameUtils; ??
  15. import?org.apache.commons.io.IOUtils; ??
  16. import?org.apache.commons.lang.RandomStringUtils; ??
  17. import?org.apache.commons.lang.StringUtils; ??
  18. import?org.jsoup.Jsoup; ??
  19. import?org.jsoup.nodes.Document; ??
  20. import?org.jsoup.nodes.Element; ??
  21. import?org.jsoup.select.Elements; ??
  22. ??
  23. import?my.mvc.BadWord; ??
  24. import?my.mvc.BlockIP; ??
  25. import?my.mvc.RequestContext; ??
  26. import?my.util.Multimedia; ??
  27. ??
  28. /** ?
  29. ?*?Action类常用工具 ?
  30. ?*?@author?Winter?Lau?@?OSChina ?
  31. ?*/??
  32. public?class?HTMLImageFetcher{ ??
  33. ??
  34. ????public?static?void?main(String[]?args)?{ ??
  35. ????????String?html?=?"这张图片很漂亮啊!"+ ??
  36. ????????????"<img?src='http://techcn.com.cn/uploads/201004/12705551313uy0urE3.jpg'?alt=''/>"+ ??
  37. ????????????"?,太帅了!<img?src='/img/logo.gif'?alt='oschina'/>"; ??
  38. ????????System.out.println(fetchHTML_Images(html)); ??
  39. ????} ??
  40. ???? ??
  41. ????/** ?
  42. ?????*?下载HTML文档中的所有图片 ?
  43. ?????*?@param?html ?
  44. ?????*?@return ?
  45. ?????*/??
  46. ????protected?static?String?fetchHTML_Images(String?html)?{ ??
  47. ????????if(StringUtils.isBlank(html)) ??
  48. ????????????return?html; ??
  49. ????????HashMap<String,?String>?img_urls?=?new?HashMap<String,String>(); ??
  50. ????????Document?doc?=?Jsoup.parse(html); ??
  51. ????????Elements?imgs?=?doc.select("img"); ??
  52. ????????for(int?i=0;i<imgs.size();i++){ ??
  53. ????????????Element?img?=?imgs.get(i); ??
  54. ????????????String?src?=?img.attr("src"); ??
  55. ????????????if(!src.startsWith("/")) ??
  56. ????????????try?{ ??
  57. ????????????????URL?imgUrl?=?new?URL(src); ??
  58. ????????????????String?imgHost?=?imgUrl.getHost().toLowerCase(); ??
  59. ????????????????if(!imgHost.endsWith(".oschina.net")){ ??
  60. ????????????????????String?new_src?=?img_urls.get(src); ??
  61. ????????????????????if(new_src?==?null){ ??
  62. ????????????????????????new_src?=?fetchImageViaHttp(imgUrl); ??
  63. ????????????????????????img_urls.put(src,?new_src); ??
  64. ????????????????????} ??
  65. ????????????????????img.attr("src",?new_src); ??
  66. ????????????????} ??
  67. ????????????}?catch?(MalformedURLException?e)?{ ??
  68. ????????????????img.remove(); ??
  69. ????????????}?catch?(Exception?e){ ??
  70. ????????????????e.printStackTrace(); ??
  71. ????????????????img.remove(); ??
  72. ????????????} ??
  73. ????????} ??
  74. ????????return?doc.body().html(); ??
  75. ????} ??
  76. ???? ??
  77. ????private?static?String?fetchImageViaHttp(URL?imgUrl)?throws?IOException?{ ??
  78. ????????String?sURL?=?imgUrl.toString(); ??
  79. ????????String?imgFile?=?imgUrl.getPath(); ??
  80. ????????HttpURLConnection?cnx?=?(HttpURLConnection)imgUrl.openConnection(); ??
  81. ????????String?uri?=?null; ??
  82. ????????try{ ??
  83. ????????????cnx.setAllowUserInteraction(false);????????? ??
  84. ????????????cnx.setDoOutput(true); ??
  85. ????????????cnx.addRequestProperty("Cache-Control",?"no-cache"); ??
  86. ????????????RequestContext?ctx?=?RequestContext.get(); ??
  87. ????????????if(ctx?!=?null) ??
  88. ????????????????cnx.addRequestProperty("User-Agent",?ctx.header("user-agent")); ??
  89. ????????????else??
  90. ????????????????cnx.addRequestProperty("User-Agent",?user_agent); ??
  91. ????????????cnx.addRequestProperty("Referer",?sURL.substring(0,?sURL.indexOf('/',?sURL.indexOf('.'))+1)); ??
  92. ????????????cnx.connect(); ??
  93. ????????????if(cnx.getResponseCode()?!=?HttpURLConnection.HTTP_OK) ??
  94. ????????????????return?null; ??
  95. ????????????InputStream?imgData?=?cnx.getInputStream(); ??
  96. ????????????String?ext?=?FilenameUtils.getExtension(imgFile).toLowerCase(); ??
  97. ????????????if(!Multimedia.isImageFile("aa."+ext)) ??
  98. ????????????????ext?=?"jpg"; ??
  99. ????????????uri?=?FMT_FN.format(new?Date())?+?RandomStringUtils.randomAlphanumeric(4)?+?'.'?+?ext; ??
  100. ????????????File?fileDest?=?new?File(img_path?+?uri); ??
  101. ????????????if(!fileDest.getParentFile().exists()) ??
  102. ????????????????fileDest.getParentFile().mkdirs(); ??
  103. ????????????FileOutputStream?fos?=?new?FileOutputStream(fileDest); ??
  104. ????????????try{ ??
  105. ????????????????IOUtils.copy(imgData,?fos); ??
  106. ????????????}finally{ ??
  107. ????????????????IOUtils.closeQuietly(imgData); ??
  108. ????????????????IOUtils.closeQuietly(fos);?????????? ??
  109. ????????????} ??
  110. ????????}finally{ ??
  111. ????????????cnx.disconnect(); ??
  112. ????????} ??
  113. ????????return?RequestContext.get().contextPath()?+?"/uploads/img/"?+?uri;?????? ??
  114. ????} ??
  115. ??
  116. ????protected?final?static?String?img_path?=?RequestContext.root()?+?"uploads"?+? ??
  117. ????????File.separator?+?"img"?+?File.separator; ??
  118. ????protected?final?static?SimpleDateFormat?FMT_FN?=?new?SimpleDateFormat("yyyyMM/ddHHmmss_"); ??
  119. ????private?final?static?String?user_agent?=?"Mozilla/4.0?(compatible;?MSIE?6.0;?Windows?NT?5.1;?SV1)"; ??
  120. ???? ??
  121. }??
  相关解决方案