自动下载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. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值