上篇所说Neditor集成秀米操作,结尾抛出一个问题,那就是图片是秀米服务器访问的地址,而且没有办法再引入时访问自己项目的服务保存图片,那么应该从保存上开始处理,获取content内容,循环内容中的所有图片服务器,本人用的是正则匹配的方式:
/**
* 根据content内容 获取里面img标签的src属性的值的列表
*
* @param content
* @return
*/
public static List<String> getImgSrc(String content) {
List<String> srcList = new ArrayList<String>();
String img = "";
Pattern p_image;
Matcher m_image;
String regEx_img = "<img[^>]*>";
p_image = Pattern.compile(regEx_img, Pattern.CASE_INSENSITIVE);
m_image = p_image.matcher(content);
while (m_image.find()) {
// 得到<img />数据
img = m_image.group();
// 匹配<img>中的src数据
Matcher m = Pattern.compile("src\\s*=\\s*\"?(.*?)(\"|>|\\s+)").matcher(img);
List<String> imgList = new ArrayList<String>();
while (m.find()) {
imgList.add(m.group(1));
}
//包含秀米服务器的图片放入srcList做处理
if(imgList.get(0).contains("statics.xiumi.us")){
srcList.add(imgList.get(0));
}
}
return srcList;
}
这样就会匹配出所有的img标签的所有src的值,因为秀米的图片名称也是唯一标识,所以不用担心冲突问题,只要上传服务器后再替换掉原来的src值就可以了。
网络图片下载到本地:
int beginPos = imgsrc.lastIndexOf(".");
//秀米图片有可能后面还有特殊字符(?x-oss-process=style/xmorient)需要另作处理
int endPost = imgsrc.lastIndexOf("?");
if(endPost == -1){
endPost = imgsrc.length();
}
String file_type = imgsrc.substring(beginPos+1, endPost);
file_type = file_type.equals("") ? "png" : file_type;
String file_name = UUID.randomUUID().toString().replaceAll("-", "") + "." + file_type;
URL url = new URL(imgsrc);/* 将网络资源地址传给,即赋值给url */
/* 此为联系获得网络资源的固定格式用法,以便后面的in变量获得url截取网络资源的输入流 */
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
DataInputStream in = new DataInputStream(connection.getInputStream());
/* 此处也可用BufferedInputStream与BufferedOutputStream */
DataOutputStream out = new DataOutputStream(new FileOutputStream("tmp/uploads/"+file_name));//磁盘目录
/* 将参数savePath,即将截取的图片的存储在本地地址赋值给out输出流所指定的地址 */
byte[] buffer = new byte[4096];
int count = 0;
while ((count = in.read(buffer)) > 0)/* 将输入流以字节的形式读取并写入buffer中 */
{
out.write(buffer, 0, count);
}
out.close();/* 后面三行为关闭输入输出流以及网络资源的固定格式 */
in.close();
connection.disconnect();
下载本地需要上传,具体结合自己的项目的逻辑来写就可以了。