首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > CSS >

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

2012-12-22 
自动下载HTML中的非本地图片,并替换内容转载的时候,文章中有图片,但是因为很多网站会做防盗链处理,使得在

自动下载HTML中的非本地图片,并替换内容

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

下面是详细代码:
?

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

热点排行