neditor+秀米上传图片处理

上篇所说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();

下载本地需要上传,具体结合自己的项目的逻辑来写就可以了。

猜你喜欢

转载自blog.csdn.net/qq_38529889/article/details/85261202