使用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;
}
}
第一种是:封装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;
}
}
相关文章推荐
- 注意:因博客园服务器搬迁,本BLOG有关图片、下载文件、链接等失效。请不要尝试使用可能弹出的证书。
- Control Study->AdRotator广告控件显示自定义配置文件中广告以及与DataGrid控件结合使用显示图片(示例代码下载)
- servlet从服务器下载文件,是图片则显示,文档则下载(可配置)
- Android 下载显示网络图片 实现直接使用类似setimage的方法来完成
- Control Study->AdRotator广告控件显示自定义配置文件中广告以及与DataGrid控件结合使用显示图片(示例代码下载)
- NSOperation 的使用(下载相关) 图片和文件都是可以的 断点续传 图片逐渐显示
- Control Study->AdRotator广告控件显示自定义配置文件中广告以及与DataGrid控件结合使用显示图片(示例代码下载)
- NSOperation 的使用(下载相关) 图片和文件都是能够的 断点续传 图片逐渐显示
- Control Study->AdRotator广告控件显示自定义配置文件中广告以及与DataGrid控件结合使用显示图片(示例代码下载)
- 用TreeView控件实现资源管理器(显示本地硬盘下所有文件夹和文件,并可以浏览图片)(示例代码下载)
- 使用EditPlus技巧,提高工作效率(附英文版、自动完成文件、语法文件下载)
- 用TreeView控件实现资源管理器(显示本地硬盘下所有文件夹和文件,并可以浏览图片)(示例代码下载)
- 学习使用资源文件[3] - 用 Image 显示资源中的图片
- 使用URLConnection下载文件或图片并保存到本地
- 使用EditPlus技巧,提高工作效率(自动完成文件、语法文件下载)
- [转]使用URLConnection下载文件或图片并保存到本地
- 使用urlconnection下载文件或图片并保存到本地
- 如何:使用 AdRotator Web 服务器控件显示 XML 文件中的广告
- 使用EditPlus技巧,提高工作效率(附英文版、自动完成文件、语法文件下载)
- 关于使用LinkButton实现点击超链完成文件下载的功能