`

自动下载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. }  
分享到:
评论

相关推荐

    将富文本编辑器中的网络图片下载到本地

    通过学习和实践这些内容,你可以掌握从富文本编辑器中提取网络图片并将其替换为本地图片的方法,提高网站内容的质量和可靠性。在实际操作时,还需要考虑性能优化,例如批量处理、异步下载等,以适应大量图片的处理...

    php采集类。含自动下载图片到本地

    自动下载图片并替换图片地址是一个常见的需求,尤其是在网页抓取过程中。当抓取到含有图片链接的HTML时,为了防止未来原始网站的图片链接失效,我们会将图片下载到本地,同时更新HTML中的图片源地址为本地路径。这一...

    ecshop_商品描述远程图片自动本地化插件.

    这款插件的主要功能是自动将商品描述中的远程图片下载并保存到本地服务器,然后替换原来的远程图片链接为本地链接。这样可以提高页面加载速度,减少对外部服务的依赖,同时也有利于保护网站的正常运行,避免因远程...

    富文本编辑器保存网络图片到本地

    // 下载图片并保存到本地 string newImageName = new HtmlImgDeal().saveImgName(strPath); string DateDirectory = DateTime.Now.ToString("yyyyMM") + "//"; string sv = Server.MapPath(imageVarPath + ...

    ecshop_商品描述远程图片自动本地化插件

    该插件的工作原理可能是通过解析商品描述中的HTML代码,识别出远程图片URL,然后自动下载这些图片并替换原来的链接,使得图片在用户浏览商品详情时直接从本地服务器加载。这样的功能实现可能涉及到以下几个关键知识...

    JS调用word的模板 替换文字图片 设置图片大小

    在JavaScript(JS)开发中,有时我们需要与Microsoft Word进行交互,比如利用Word模板来替换文本和图片,以实现自动化文档生成。在这个场景中,我们主要关注如何通过JS操作Word模板,替换其中的文字和图片,并调整...

    自动识别HTML代码里的图片链接 (代码行)

    这段代码是用于自动识别HTML代码中的图片链接,并将这些图片下载到服务器的指定目录。它包含了一个名为`HanlerFiles`的类,该类有三个主要方法:`GetImgTag`、`GetImgUrl`和`SaveUrlPics`。 1. `GetImgTag`方法: ...

    移动端文本编辑器带图片上传,处理文本中的图片下载到本地

    对于描述中提到的"处理截取图片到本地",这可能是指在编辑器中,当用户插入网络图片时,编辑器会自动下载图片到本地,然后用本地路径替换网络URL,以确保在离线环境下仍能显示图片。这一步涉及到前端的图片下载和...

    网页HTML转图片image并下载

    在IT领域,将网页HTML转换为图片并进行下载是一个常见的需求,这主要应用于网页截图、网页快照或者便于分享和保存网页内容等场景。本文将详细介绍如何利用HTML2image库来实现这一功能,并探讨相关技术点。 ...

    Python3实现Markdown生成的网页中嵌入本地图片

    用户可以通过图形界面或者命令行参数直接运行,输入图片路径和Markdown文件路径,程序会自动处理并更新Markdown文件。 使用这种方式,Markdown生成的网页即使在离线环境下也能正确显示图片,提高了文档的自包含性和...

    swift-WKWebView显示HTML中的GIF动图WebP无损图片最简单最方便的接入

    这里的`path_to_your.webp`应替换为你的WebP图片的本地路径。`BAWKWebView-WebP`库会自动处理WebP图片的解码和渲染。 为了确保`WKWebView`正确加载WebP图片,你需要在你的项目中包含WebP的编译库。`BAWKWebView-...

    monaco编辑器(html+本地资源)

    1. **丰富的代码编辑功能**:Monaco编辑器支持多种编程语言的语法高亮、自动完成、代码折叠、查找和替换等功能,提供了一流的代码编辑体验。 2. **实时代码验证**:它可以实时检查代码的语法错误和潜在问题,帮助...

    使用matlab编程自动下载网站上的文件

    在MATLAB中,如果你需要自动下载网站上的文件,可以利用MATLAB提供的内置函数`urlwrite`来实现。这个函数能够方便地将网络上的资源下载到本地。本篇将详细介绍如何使用MATLAB编程来批量下载同一类型文件,并以“2011...

    java代码生成html文件

    在IT行业中,Java是一种广泛应用的编程语言,尤其在构建Web应用程序方面。本示例将探讨如何使用Java生成HTML文件,这是构建动态网站或自动化报告等任务时常见的需求。通过Java生成HTML,我们可以将数据结构转化为...

    文本替换工具,一款网站修改的好工具

    在计算机科学中,文本替换是通过程序自动搜索和替换文本文件中的特定模式或字符串的过程。这个过程通常涉及两个主要参数:查找字符串和替换字符串。查找字符串是你希望找到的特定文本,而替换字符串则是你想要用以...

    html转图片的java代码

    为了将HTML转换为图片,我们需要一种机制来渲染HTML内容并捕获其屏幕快照。Java中,我们可以借助如Selenium WebDriver或者PhantomJS等工具来实现这个过程。 1. **Selenium WebDriver**: Selenium是一个自动化测试...

    自动化打开指定本地网页,定时更新

    首先,需要下载Chrome的WebDriver(chromedriver),然后替换代码中的webdriver.Firefox()为webdriver.Chrome()。对于Edge浏览器,由于它基于Chromium内核,所以可以使用与Chrome相同的方式,只需下载对应的...

    html编辑器的图片

    在HTML编辑器中处理图片是一项常见的任务,因为图片是网页内容的重要组成部分,可以提升用户体验,传达信息或增强视觉吸引力。在这个主题中,我们将深入探讨在HTML编辑器中插入、管理和优化图片的关键知识点。 1. ...

    批量代码替换,网页代码批量替换

    批量代码替换指的是在大量的代码文件或网页文件中,一次性查找并替换特定的代码片段,而无需逐个文件手动操作。这项技术广泛应用于代码标准化、错误修正、更新网站模板或者迁移旧代码库至新框架等场景。 批量代码...

    vue图片加载失败时用默认图片替换的方法

    本篇文章将详细介绍如何在Vue中实现图片加载失败时用默认图片进行替换。 首先,我们需要理解这个过程的基本原理。当图片加载失败时,浏览器会触发`error`事件。我们可以利用这个事件,在图片加载失败时,用预设的...

Global site tag (gtag.js) - Google Analytics