文档章节

如何实现自动缓存文章的图片?

harries
 harries
发布于 2016/07/08 17:30
字数 821
阅读 41
收藏 2
点赞 0
评论 0

前沿:我相信大家多多少少应该发过一些文章,或者写过一些博客。对于文章的图片各个平台是如何处理的呢。如:QQ空间会把所有文章的图片缓存到qq服务器上。那么如何实现这一功能呢?大家有没有思考过?

QQ图片20160708172547

好!下面我们带着问题来思考这个问题“如何实现自动缓存文章的图片?” 首先,自动就必须无人工去干预,必须程序自动检测文章是否包含图片。其次,缓存图片那就必须下载图片,下载图片如何防止爬虫!带着这个思路我们把整理称如下步骤

1.程序定时跑任务,如每30秒扫面一下文章里面是否又需要替换的图片(非本站图片)

2.解析文章里面的图片url(需要用到正则或者html解析工具,如jsoup)

3.自动下载到本地服务器上(需要网络连接相关工具包,对于某些网站,可能需要用过代理)

4.替换原文章里面的url(正则替换或者字符串替换)

1.程序定时跑任务

<bean id="downloadImageTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
 <property name="jobDetail" ref="downloadImageCron" />
 <property name="cronExpression" value="0/30 * * * * ?" /> 
 </bean>

2.解析文章里面的图片url

public void addImageUrl(Document doc,BsArticle bsarticle ){
 Elements elements = doc.select("div.article_body").select("img");
 for(Element element:elements){
 String imageUrl =element.attr("src");
 BsReplaceimage bsReplaceimage = new BsReplaceimage();
 bsReplaceimage.setOldImageurl(processsImage(imageUrl));
 bsReplaceimage.setProcessFlag(0);
 bsReplaceimage.setArticleId(bsarticle.getId());
 try {
 replaceImageService.addReplaceImage(bsReplaceimage);
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
 }

3.自动下载到本地服务器上

/**
* 下载图片
* 把从服务器获得图片的输入流InputStream写到本地磁盘
* @Method_Name : downImage
* @param urlString
* @param filename
* @param savePath
* @return : void
* @Creation Date : 2016年7月8日 上午11:06:25
* @version : v1.00
* @Author : liuhaihua
* @Update Date :
* @Update Author :
*/
public static String downImage(String oldurlString, String filename,String savePath) {
String newurlString ="";
InputStream inputStream = getInputStream(oldurlString);
byte[] data = new byte[1024];
int len = 0;
FileOutputStream fileOutputStream = null;
try {
String absolute_path ="/alidata1/ftp"+savePath;
File sf=new File(absolute_path);
if(!sf.exists()){
sf.mkdirs();
}
newurlString =savePath+"/"+filename+"."+parseSuffix(oldurlString);
fileOutputStream = new FileOutputStream(sf.getPath()+"/"+filename+"."+parseSuffix(oldurlString));

while ((len = inputStream.read(data)) != -1) {
fileOutputStream.write(data, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return newurlString;
}

/**
* 从服务器获得一个输入流(本例是指从服务器获得一个image输入流)
* @Method_Name : getInputStream
* @param URL_PATH
* @return
* @return : InputStream
* @Creation Date : 2016年7月8日 上午11:07:00
* @version : v1.00
* @Author : liuhaihua
* @Update Date :
* @Update Author :
*/
public static InputStream getInputStream(String URL_PATH) {
InputStream inputStream = null;
HttpURLConnection httpURLConnection = null;
try {
URL url = new URL(URL_PATH);
httpURLConnection = (HttpURLConnection) url.openConnection(proxy);
// 设置网络连接超时时间
httpURLConnection.setConnectTimeout(3000);
// 设置应用程序要从网络连接读取数据
httpURLConnection.setDoInput(true);
httpURLConnection.setRequestMethod("GET");
int responseCode = httpURLConnection.getResponseCode();
if (responseCode == 200) {
// 从服务器返回一个输入流
inputStream = httpURLConnection.getInputStream();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return inputStream;
}

4.替换原文章里面的url

System.out.println("oldurl--------------------:"+oldurl);
System.out.println("newurl--------------------:"+newurl);
String newcontent = content.replace(oldurl, newurl);

PS:如果您想和业内技术大牛交流的话,请加qq群(521249302)或者关注微信公众 号(AskHarries),谢谢!

© 著作权归作者所有

共有 人打赏支持
harries
粉丝 31
博文 80
码字总数 57991
作品 3
朝阳
其他
如何实现自动缓存文章的图片?

前沿:我相信大家多多少少应该发过一些文章,或者写过一些博客。对于文章的图片各个平台是如何处理的呢。如:QQ空间会把所有文章的图片缓存到qq服务器上。那么如何实现这一功能呢?大家有没有...

外星人et59 ⋅ 2016/07/08 ⋅ 0

【Google官方教程】第四课:在UI中显示Bitmap

转载声明:Ryan的博客文章欢迎您的转载,但在转载的同时,请注明文章的来源出处,不胜感激! :-) http://my.oschina.net/ryanhoo/blog/88484 译者:Ryan Hoo 来源:https://developer.andro...

RyanHoo ⋅ 2012/11/11 ⋅ 3

Android图片加载框架最全解析(三),深入探究Glide的缓存机制

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/54895665 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每天都有文章更新。 在本...

sinyu890807 ⋅ 2017/05/23 ⋅ 0

腾讯技术分享:Android版手机QQ的缓存监控与优化实践

本文内容整理自公众号腾讯Bugly,感谢原作者的分享。 1、问题背景 对于Android应用来说,内存向来是比较重要的性能指标。内存占用过高,会影响应用的流畅度,甚至引发OOM,非常影响用户体验。...

JackJiang2011 ⋅ 04/08 ⋅ 0

Android图片加载框架最全解析(八),带你全面了解Glide 4的用法

转载请注明出处:http://blog.csdn.net/guolinblog/article/details/78582548 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每天都有文章更新。 本篇将...

sinyu890807 ⋅ 2017/12/19 ⋅ 0

iOS开发-你真的会用SDWebImage?

iOS开发-你真的会用SDWebImage? SDWebImage作为目前最受欢迎的图片下载第三方框架,使用率很高。但是你真的会用吗?本文接下来将通过例子分析如何合理使用SDWebImage。 使用场景:自定义的U...

法斗斗 ⋅ 2016/06/01 ⋅ 0

Spring Boot + Mybatis + Redis二级缓存(Java Web现代化开发)

背景 SpringBoot 因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一。Mybatis是一个十分轻量好用的ORM框架。Redis是当今十分主流的分布式key-value型数据库,在...

小红牛 ⋅ 2017/12/13 ⋅ 0

解决缓存引发的CSS/JS/IMG问题

这次转载的文章讲的是CSs缓存的问题。CSS一般情况下,我们都会做一定的缓存,毕竟这玩意很少会动它,但对于一个稍大一点的网站来说,它就可能会经常变动了。 然而,CSS对于浏览器来说,一般情...

Sunmicro ⋅ 2014/02/23 ⋅ 0

前端计划——面试题总结-HTML篇

前言: 阅读本文前请做好以下心理准备: 本系列文章将不定期更新。 本系列文章不是很严谨。 前端面试之HTML篇 Part A:常识系列 你真的了解浏览器么? HTML中的Doctype是什么鬼? 多了个X的X...

Alarak ⋅ 2017/01/02 ⋅ 0

Android图片加载框架:Glide的常用用法|SquirrelNote

我的系列文章 Android图片加载框架:Glide的常用用法|SquirrelNote Android图片加载框架:Glide源码解析|SquirrelNote 前言 现在Android上的图片加载框架非常成熟,从最早的图片加载框架Uni...

跳动的松鼠 ⋅ 2017/11/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CENTOS7防火墙命令记录

安装Firewall命令: yum install firewalld firewalld-config Firewall开启常见端口命令: firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --zone=public --add-po......

cavion ⋅ 今天 ⋅ 0

【C++】【STL】利用chromo来测量程序运行时间与日志时间打印精确到微秒

直接上代码吧,没啥好说的。头疼。 #include <iostream>#include <string>#include <ctime>#include <sstream>#include <iomanip>#include <thread>#include <chrono>using ......

muqiusangyang ⋅ 今天 ⋅ 0

Mac环境下svn的使用

在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境。在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还需做一下简...

故久呵呵 ⋅ 今天 ⋅ 0

破解公司回应苹果“USB限制模式”:已攻破

本周四,苹果发表声明称 iOS 中加入了一项名为“USB 限制模式”的功能,可以防止 iPhone 在连接其他设备的时候被破解,并且强调这一功能并不是针对 FBI 等执法部门,为的是保护用户数据安全。...

六库科技 ⋅ 今天 ⋅ 0

MyBtais整合Spring Boot整合,TypeHandler对枚举类(enum)处理

概要 问题描述 我想用枚举类来表示用户当前状态,枚举类由 code 和 msg 组成,但我只想把 code 保存到数据库,查询处理,能知道用户当前状态,这应该怎么做呢?在 Spring 整合MyBatis 的时候...

Wenyi_Feng ⋅ 今天 ⋅ 0

synchronized与Lock的区别

# <center>王梦龙的读书笔记第一篇</center> ## <center>-synchronized与Lock的区别</centre> ###一、从使用场景来说 + synchronized 是能够注释代码块、类、方法但是它的加锁是和解锁使用一......

我不想加班 ⋅ 今天 ⋅ 0

VConsole的使用

手机端控制台打印输出,方便bug的排查。 首先需要引入vconsole.min.js 文件,然后在文件中创造实例。就能直接使用了。 var vConsole = new VConsole(); vConsole的文件地址...

大美琴 ⋅ 今天 ⋅ 0

Java NIO之字符集

1 字符集和编解码的概念 首先,解释一下什么是字符集。顾名思义,就是字符的集合。它的初衷是把现实世界的符号映射为计算机可以理解的字节。比如我创造一个字符集,叫做sex字符集,就包含两个...

士别三日 ⋅ 今天 ⋅ 0

Spring Bean基础

1、Bean之间引用 <!--如果Bean配置在同一个XML文件中,使用local引用--><ref bean="someBean"/><!--如果Bean配置在不同的XML文件中,使用ref引用--><ref local="someBean"/> 其实两种......

霍淇滨 ⋅ 今天 ⋅ 0

05、基于Consul+Upsync+Nginx实现动态负载均衡

1、Consul环境搭建 下载consul_0.7.5_linux_amd64.zip到/usr/local/src目录 cd /usr/local/srcwget https://releases.hashicorp.com/consul/0.7.5/consul_0.7.5_linux_amd64.zip 解压consu......

北岩 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部