JAVA-替换html中图片的路径-从html代码中提取图片路径并下载(完整版)
transHtml方法实现提取网络图片中得图片路径,将其重新下载到本地,并替换html中原来得路径
package com.googosoft.until; import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest; /**
* @author sonyan
* @version 2019年11月25日 下午2:12:32
* @desc
*/
public class Test { /**
* 将html中的图片下载到服务器,并且使用服务器上图片的地址替换图片的网络路径
* @param html 要处理的html
* @param request
* @param uploadFolder 服务器上保存图片的目录
* @return
*/
public static String transHtml(String html,HttpServletRequest request,String uploadFolder){
List<String> imgList = getImgStrList(html,request);
for (String imgStr : imgList) {
try {
String newUrl = reSaveImage(imgStr, request,uploadFolder);
html = html.replace(imgStr, newUrl);
} catch (Exception e) {
e.printStackTrace();
}
}
return html;
} /**
* 将指定的网络图片保存到本地指定目录
* @param httpUrl 图片原来的网络路径
* @param request
* @param uploadFolder 服务器上保存图片的目录
* @return httpUrl newPath
*/
private static String reSaveImage(String httpUrl, HttpServletRequest request,String uploadFolder){
FileOutputStream out = null;
BufferedInputStream in = null;
HttpURLConnection connection = null;
Map<String, Object> urlMap = new HashMap<>(); byte[] buf = new byte[1024];
int len = 0;
try {
URL url = new URL(httpUrl);
connection = (HttpURLConnection) url.openConnection();
connection.connect();
in = new BufferedInputStream(connection.getInputStream());
urlMap = getNewPath(httpUrl, request,uploadFolder);
out = new FileOutputStream(urlMap.get("newPath").toString());
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
in.close();
out.close();
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
} return urlMap.get("newUrl").toString();
} /**
* 获取保存在服务器上的图片的实际存储地址以及访问地址
* @param httpUrl 图片原来的网络路径
* @param request
* @param uploadFolder服务器上保存图片的目录
* @return
*/
private static Map<String, Object> getNewPath(String httpUrl, HttpServletRequest request,String uploadFolder) {
Map<String, Object> relMap = new HashMap<>();
String fileName = getFileName();
String filefix = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();// 文件后缀
fileName = UuidUtil.get32UUID() + "." + filefix;
String prefix = getUrlPrefix(request) + "/iconimg/";
relMap.put("newUrl", prefix + fileName);
relMap.put("newPath", uploadFolder + fileName);
return relMap;
} /**
* 设置图片的名称(时间+用户编号)
* @return
*/
private static String getFileName() {
return "reload"+File.pathSeparator+new Date().getTime()+".jpg";
} /**
* 提取HTML字符串中的img
* @param htmlStr 要处理的html字符串
* @return
*/
private static List<String> getImgStrList(String htmlStr,HttpServletRequest request) {
List<String> list = new ArrayList<>();
String img = "";
Pattern p_image;
Matcher m_image;
String regEx_img = "<img.*src\\s*=\\s*(.*?)[^>]*?>";
p_image = Pattern.compile(regEx_img, Pattern.CASE_INSENSITIVE);
m_image = p_image.matcher(htmlStr);
while (m_image.find()) {
img = m_image.group();
Matcher m = Pattern.compile("src\\s*=\\s*\"?(.*?)(\"|>|\\s+)").matcher(img);
while (m.find()) {
String path = m.group(1);
if(!path.startsWith(getUrlPrefix(request))){
list.add(handleSrc(path));
}
}
}
return list;
} /**
* 去除src路径中的前后引号
* @param src 图片的src路径
* @return
*/
private static String handleSrc(String src) {
if (src != null) {
if (src.startsWith("'")|| src.startsWith("\"")) {
return src.substring(1, src.length());
}
if (src.endsWith("'")|| src.endsWith("\"")) {
return src.substring(0, src.length());
}
}
return src;
} /**
* 获取网站的URL
* @param request
* @return 例如:http://192.168.11.3:8089
*/
public static String getUrlPrefix(HttpServletRequest request) {
StringBuffer str = new StringBuffer();
str.append(request.getScheme());
str.append("://");
str.append(request.getServerName());
if (80 != request.getServerPort()) {
str.append(":" + request.getServerPort());
}
str.append(request.getContextPath());
return str.toString();
}
}
JAVA-替换html中图片的路径-从html代码中提取图片路径并下载(完整版)的更多相关文章
- 为什么阿里巴巴Java开发手册中不允许魔法值出现在代码中?
在阅读<阿里巴巴Java开发手册>时,发现有一条关于关于常量定义的规约,具体内容如下: 图中的反例是将数据缓存起来,并使用魔法值加链路 id 组成 key,这就可能会出现其他开发人员在复制 ...
- 使用Java8中的Optional类来消除代码中的null检查
简介 Optional类是Java 8新增的一个类,Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException). —— 每个 Java 程序员都非常了解的异常 ...
- django中使用FastDFS分布式文件系统接口代码实现文件上传、下载、更新、删除
运维使用docker部署好之后FastDFS分布式文件系统之后,提供给我接口如下: fastdfs tracker 192.168.1.216 192.168.1.217 storage 192.16 ...
- php正则过滤html标签、空格、换行符的代码,提取图片
$descclear = str_replace("r","",$descclear);//过滤换行 $descclear = str_replace(&quo ...
- sublime中使用插件anaconda而在代码中出现方框
这个标志是说不符合PEP8标准,比如使用了Tab做缩进:一行过长等问题. 可以在可以在 Sublime > Preferences > Package Settings > Anac ...
- 去除C/C++程序代码中的注释
最近搞软件著作权,去除代码空行和注释比较麻烦,想写个程序自动去除,去网上搜了下,发现有类似的程序,不过只有去除注释.鉴于word中可以去除空行(用^p^p替换^p),先用网上的代码,以后有时间写个完整 ...
- Python提取图片的ROI
图像处理经常需要提取图片的ROI,本文使用Python提取图片的ROI. 使用的Module是PIL (Pillow),一个图像处理库,用到的函数为类 Image 中的 crop 方法. 函数原型为: ...
- System.Diagnostics.Conditional 的妙用 -- 把文档放在代码中
最近的工作跟 UI 打交道比较多, 各种坑. 今天从 Prefab 的序列化功能来说说 System.Diagnostics.Conditional 的妙用. 我们做 UI 面对各种按钮, 组件的获取 ...
- Python-Jenkins API使用 —— 在后端代码中操控Jenkins
最近在工作中需要用到在后台代码中触发Jenkins任务的构建,于是想到Jenkins是否有一些已经封装好的API类库提供,用于处理跟Jenkins相关的操作.下面就简单介绍下我的发现. Linux C ...
随机推荐
- 题解【洛谷P6029】[JSOI2010]旅行
题面 简化版题意:给出 \(n\) 个点 \(m\) 条边的无向图,可以交换任意两条边的权值 \(k\) 次,求 \(1\) 结点到 \(n\) 结点的最短路. 考虑\(\text{DP}\). 把所 ...
- 解决PHP Redis扩展无法加载的问题
最近在工作中需要使用PHP访问Redis,从https://github.com/phpredis/phpredis下载了phpredis,并且按照官方的说明进行了安装 phpize ./config ...
- [CF1236D] Alice and the Doll - 模拟,STL
[CF1236D] Alice and the Doll Description \(N \times M\)网格,有 \(K\) 个格子里有障碍物.每次经过一个格子的时候只能直走或者右转一次.初态在 ...
- vue图书小案例
小知识点: vue中计算属性有缓存(对象属性变化时才会更新),方法没有缓存,所以计算属性比方法效率高js中let有块级作用域,var没有块级作用域,所以var是有缺陷的this.letters[0] ...
- 你是否听说过 HashMap 在多线程环境下操作可能会导致程序死循环?
作者:炸鸡可乐 原文出处:www.pzblog.cn 一.问题描述 经常有些面试官会问,是否了解过 HashMap 在多线程环境下使用时可能会发生死循环,导致服务器 cpu 100% 的线上故障? 关 ...
- anniversary party_hdu1520
本来以为是一道很简单的提,可以分分钟解决(实际上就是很简单) 然而一直报错,找半天,竟然要多组输入(还是太菜了) 所以每组需要先初始化, 这是一道树形DP的简单题,具体思路就是我选这个上司就不能选他的 ...
- <context:component-scan>标签
在spring-mvc的配置文件Springmvc-servlet.xml中,要扫描Controller注解的类,用<context:include-filter>标签 <conte ...
- c++中sort函数调用报错Expression : invalid operator <的内部原理 及解决办法
转自:https://www.cnblogs.com/huoyao/p/4248925.html 当我们调用sort函数进行排序时,中的比较函数如果写成如下 bool cmp(const int &a ...
- 三值的排序 Sorting a Three-Valued Sequence(洛谷 P1459USACO2.1,IOI96Day2)
Sorting a Three-Valued Sequence IOI'96 - Day 2 Sorting is one of the most frequently performed compu ...
- 后端——框架——日志框架——logback——《官网》阅读笔记——第一章节
第一章节搭建了logback日志框架的环境,演示了Hello World的示例,并详细分析了示例. 搭建日志框架的过程非常简单,只需要在项目的classpath上添加以下三个jar包,logback- ...