获取第三方图片url,转换为base64之后,作为参数请求第三方接口,转换错误问题

第一次用的普遍的转换方法,结果转换出来的base串,一直不能用。代码如下:

public static String encodeImageToBase64(URL url) throws Exception {
        //将图片文件转化为字节数组字符串,并对其进行Base64编码处理
        //System.out.println("图片的路径为:" + url.toString());
        //打开链接
        HttpURLConnection conn = null;
        try {
        conn = (HttpURLConnection) url.openConnection();
        //设置请求方式为"GET"
        conn.setRequestMethod("GET");
        //超时响应时间为5秒
        conn.setConnectTimeout(5 * 1000);
        //通过输入流获取图片数据
        InputStream inStream = conn.getInputStream();
        //得到图片的二进制数据,以二进制封装得到数据,具有通用性
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        //创建一个Buffer字符串
        byte[] buffer = new byte[1024];
        //每次读取的字符串长度,如果为-1,代表全部读取完毕
        int len = 0;
        //使用一个输入流从buffer里把数据读取出来
        while ((len = inStream.read(buffer)) != -1) {
        //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
        outStream.write(buffer, 0, len);
        }
        //关闭输入流
        inStream.close();
        byte[] data = outStream.toByteArray();
        //对字节数组Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        String base64 = encoder.encode(data);
        //System.out.println("网络文件[{}]编码成base64字符串:[{}]"+url.toString()+base64);
        return base64;//返回Base64编码过的字节数组字符串
        } catch (IOException e) {
        e.printStackTrace();
        throw new Exception("图片上传失败,请联系客服!");
        }
        }
    /** 
     * 远程读取image转换为Base64字符串 
     * @param imgUrl 
     * @return 
     */  
    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 new BASE64Encoder().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;  
    }

最后也是无奈了,把图片拿下来,用http://imgbase64.duoshitong.com/这个网站转换,结果值能用正确的,继续无语。

然后开启疯狂的搜索大法,最终找到了一个代码,果断解决问题:代码如下:

/**
     * 通过图片的url获取图片的base64字符串
     * @param imgUrl    图片url
     * @return    返回图片base64的字符串
     */
    public static String image2Base64one(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 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;  
    } 
    public static String encode(byte[] image){
        BASE64Encoder decoder = new BASE64Encoder();
        return replaceEnter(decoder.encode(image));
    }
    public static String replaceEnter(String str){
        String reg ="[\n-\r]";
        Pattern p = Pattern.compile(reg);
        Matcher m = p.matcher(str);
        return m.replaceAll("");
    }

 

posted @ 2019-04-16 12:27  烟雨观春柳  阅读(850)  评论(0)    收藏  举报