图片url转为base64编码

April 21, 2020 · 默认分类 · 406次阅读

由于开发拼多多的第三方服务系统,需要调用拼多多中的图片上传接口,其中参数要求是将img格式图片转为base64编码进行入参。但是我们这边的图片都是url形式提供的,想想思路大概是将图片通过http方式下载为二进制流形式然后再用base64的工具类进行转码。果然百度上有现成的轮子:

    /**
     * 通过图片的url获取图片的base64字符串
     * @param imgUrl    图片url
     * @return    返回图片base64的字符串
     */
    public static String image2Base64(String imgUrl) {

        URL url = null;

        InputStream is = null;

        ByteArrayOutputStream outStream = null;

        HttpURLConnection httpUrl = null;

        try{

            url = new URL(imgUrl);

            httpUrl = (HttpURLConnection) url.openConnection();

            httpUrl.connect();

            httpUrl.getInputStream();

            is = httpUrl.getInputStream();



            outStream = new ByteArrayOutputStream();

            //创建一个Buffer字符串

            byte[] buffer = new byte[1024];

            //每次读取的字符串长度,如果为-1,代表全部读取完毕

            int len = 0;

            //使用一个输入流从buffer里把数据读取出来

            while( (len=is.read(buffer)) != -1 ){

                //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度

                outStream.write(buffer, 0, len);

            }

            // 对字节数组Base64编码

            return Base64Util.encode(outStream.toByteArray());

        }catch (Exception e) {

            e.printStackTrace();

        }

        finally{

            if(is != null)

            {

                try {

                    is.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

            if(outStream != null)

            {

                try {

                    outStream.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

            if(httpUrl != null)

            {

                httpUrl.disconnect();

            }

        }

        return imgUrl;

    }
}

然后是Base64工具类:

public class Base64Util{
    /**
     * 字符串转图片
     * @param base64Str
     * @return
     */
    public static byte[] decode(String base64Str){
        byte[] b = null;
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            b = decoder.decodeBuffer(replaceEnter(base64Str));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return b;
    }

    /**
     * 图片转字符串
     * @param image
     * @return
     */
    public static String encode(byte[] image){
        BASE64Encoder decoder = new BASE64Encoder();
        return replaceEnter(decoder.encode(image));
    }

    public static String encode(String uri){
        BASE64Encoder encoder = new BASE64Encoder();
        return replaceEnter(encoder.encode(uri.getBytes()));
    }

    /**
     *
     * @path    图片路径
     * @return
     */

    public static byte[] imageTobyte(String path){
        byte[] data = null;
        FileImageInputStream input = null;
        try {
            input = new FileImageInputStream(new File(path));
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
            int numBytesRead = 0;
            while((numBytesRead = input.read(buf)) != -1){
                output.write(buf, 0, numBytesRead);
            }
            data = output.toByteArray();
            output.close();
            input.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

        return data;
    }



    public static String replaceEnter(String str){
        String reg ="[\n-\r]";
        Pattern p = Pattern.compile(reg);
        Matcher m = p.matcher(str);
        return m.replaceAll("");
    }
}

但是得到结果串放入拼多多请求参数中提示有错误。。。。。

最后发现,base64编码最前面还要加上

data:image/jpg;base64,

标签:none

最后编辑于:2020/04/21 08:51

添加新评论

控制面板