您的位置:首页 > 数据库 > Redis

使用redis文件服务器完成图片下载显示

2017-07-17 15:26 363 查看
从redis获取字节流后,显示图片有两种方式

第一种是:封装url对象的方式,该方式使用xmlresponse异步调用,

js代码如下:

前端js代码

            get_tp_yzm:function(){

                var xhr = new XMLHttpRequest();

                xhr.open("get", pub.dt.url_cloud+'verity/getBanner', true);

                xhr.responseType = "blob";

                xhr.onload = function() {

                    if (this.status == 200) {

                        /*var blob = this.response;

                        var img = document.createElement("img");

                        img.onload = function(e) {

                            window.URL.revokeObjectURL(img.src);

                        };

                        img.src = window.URL.createObjectURL(blob);

                        $("#imgcontainer").html(img);*/

                        console.log(1222);

                        var blob = this.response;

                        $('.yzm_img').attr({'src':window.URL.createObjectURL(blob)});

                    }

                } ;

                xhr.send();

            }

后台java代码:

   public String verfyCode(HttpServletResponse response, HttpServletRequest request){

        response.setHeader("Access-Control-Allow-Origin", "*");//解决跨域问题

       OutputStream out = null;

        

        try

        {

            out = response.getOutputStream();

            

            response.setHeader("Pragma", "No-cache");

            response.setHeader("Cache-Control", "no-cache");

            response.setDateHeader("Expires", 0);

            response.setContentType("image/jpeg");

            InputStream in = FileServerUtil.downLoadFile("cdtp02", "cdtp-DM20179b8a-1499933563457");//下载图片

            

               BufferedImage image = ImageIO.read(in);

                        ImageIO.write(image, "jpg", os);

                        os.flush();

            logger.info("调用图片验证码完成");

        }

        catch (Exception e){ }finally{ if (out != null) {try { out.close(); } catch (IOException e) { e.printStackTrace(); } }}

        return null;

    }

    

第二种方式是采用BASE64字节编码形式:

  前端,采用如下标签,将BASE64Source替换成返回的字符串数据即可显示

    <img src="data:image/jpg;base64,BASE64Source">

   

   后台代码

public String getPartner(HttpServletResponse response, HttpServletRequest request){

        

        response.setHeader("Access-Control-Allow-Origin", "*");

        InputStream in = FileServerUtil.downLoadFile(bucketName, jsonObject.getString("bucketKey"));

        

        String imageStr = BaseImage.getImageString(in);

        

        //输入流关闭

        try {in.close();} catch (IOException e) {e.printStackTrace();

        }finally {if(in != null){try {in.close();} catch (IOException e) {e.printStackTrace();}}}

        return imageStr;

    }

    

下面是后台代码用到的工具转换类   

    public class BaseImage {

    private static BASE64Encoder encoder = new BASE64Encoder();

    

    /**

     * 获取图片输入流

     */

    public static String getImageString(InputStream in){

        String sb = "";

        byte[] data = new byte[2];//之所以每次读2个长度,和从redisd读取的速度有关

        int leng = 0;

        try {

            while((leng = in.read(data))!= -1){

                sb = sb + byteToString(data);

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

        byte[] res = stringTobyte(sb);

        String imageStr = encoder.encode(res);

        return imageStr;

    }

    

    /**

     * 字节转字符串

     */

    private static String byteToString(byte[] src){

        if(src==null||src.length==0){

            return null;

        }

        char[] res = new char[src.length*2];

        

        final char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};

        for(int i=0, j=0; i<src.length; i++){

            res[j++] = hexDigits[src[i]>>4 & 0x0f];

            res[j++] = hexDigits[src[i] & 0x0f];

        }

        return new String(res);

    }

    

    /**

     * 字符串转字节数组

     */

    private static byte[] stringTobyte(String src){

        if(src==null || src.length()==0){

            return null;

        }

        

        int length = src.length()/2;

        char[] hexChar = src.toCharArray();

        byte[] data = new byte[length];

        String hexDigits = "0123456789abcdef";

        

        for (int i = 0; i < length; i++) {

            int pos = i*2;

            int h = hexDigits.indexOf(hexChar[pos])<<4;

            int l = hexDigits.indexOf(hexChar[pos+1]);

            if(h==-1 || l==-1){

                return null;

            }

            data[i] = (byte)(h|l);

        }

        return data;

    }

}

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐