显示web端servlet向android端传输二进制格式图片

来源:互联网 发布:网络摄像头破解 编辑:程序博客网 时间:2024/05/27 01:29

我们项目组的组长居然要将图片转成二进制流存到数据库内~~。。。我去。。。极度不赞同啊。哎个人意见是将图片上传到服务器端,将图片资源保存保存到服务器端的磁盘上,数据库存储的只是图片在服务端的路径。。。。但。哎~~官大一级压死人啊。。没办法呗~~只好动脑找资料,经过一天的奋斗终于把这问题给解决咯~~呵呵呵

我的思路是将图片转成二进制流byte[],再将byte[]转成String类型的字符串,然后利用流将其传输。

好了 不多说咯 上代码。

首先在web端的servlet内

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
FileInputStream fis=new FileInputStream("F:/古典美女/haha.jpg");
ByteArrayOutputStream baos=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int count=0;
while((count=fis.read(buffer))>=0){
baos.write(buffer);
}
String str=new String(Base64.encode(baos.toByteArray()));
PrintWriter pw=response.getWriter();
pw.write(str);
pw.flush();
pw.close();
}

这部分的代码位于web端的servlet的doPost方法内。。我这里为了简约。。没有连接数据库得到图片的二进制流,而是用本地的一张图片将其转为二进制数组,将其传到android端。。道理都是一样的。。呵呵呵呵呵。

最值得注意的是:String str=new String(Base64.encode(baos.toByteArray()));这句代码,利用Base64的编码类的静态方法encode将一个byte[]转成String类型的对象

注意。。尽管byte[]也有一个toString的方法可以将byte[]转成String,但貌似这个方法存在弊端。会存在数据丢失和乱码(我试过了。。不知道你们会怎样。。)然后用PrintWriter写出去。。。。。

好了 web端的代码就这么多

关键是android端的代码。ok!!! 上代码

先说明.android端的AndroidManifest.xml文件要添加<uses-permission android:name="android.permission.INTERNET"/>权限

private ImageView image=null;
public static String path="http://10.0.2.2:8080/ConnDB/NewServlet";
private String result="";

先在activity内声明三个变量。

在OnCreate()内

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        image=(ImageView) findViewById(R.id.image);
        showImage();
    }

好了 来看看showImage方法内的代码

public void showImage(){
     HttpGet request=new HttpGet(path);
try {
//使用response接收servlet返回的数据
HttpResponse response=new DefaultHttpClient().execute(request);
//判断servlet是否返回成功
if(response.getStatusLine().getStatusCode()==200){
HttpEntity entity=response.getEntity();
BufferedReader br=new BufferedReader(new InputStreamReader
(entity.getContent(),"UTF-8"));
String line="";
while((line=br.readLine())!=null){
result=result+line;
}
System.out.println(result);
if(!result.equals("")){
Bitmap bitmap=ConnTestActivity.getBitmapFromByte(result);
image.setImageBitmap(bitmap);
}
}
}catch(Exception e){
e.printStackTrace();
}
result="";
    }

这里通过传过来的String生成byte[],在用其生成一个Bitmap对象,在设置在ImageView内 将其显示

Bitmap bitmap=ConnTestActivity.getBitmapFromByte(result);
image.setImageBitmap(bitmap);

下面来看看getBitmapFromByte(result);方法

public static Bitmap getBitmapFromByte(String str){
     if(str==null){
     return null;
     }
     Bitmap bitmap=null;
byte[] bytes = Base64.decode(str);
bitmap=BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
return bitmap;
    }

byte[] bytes = Base64.decode(str);这句代码的作用于web端的作用相反,将Streing转换成byte[]。。。。。

好了 代码写到这里咯。。。。接下来就是运行了

运行android模拟器将会显示


不过这里有点小小的问题。。。就是Base64这个类。。。。

Base64这个类原本并不属于java官方类的api,尽管在java文件中可以使用这个类。。但在android使用的话却会报错。。。就是这一点搞得我很头痛 。。结果实在没办法,只好上网找别人写好的编码类。。将其变成一个class类放到项目中使用。ok 问题解决。。。。。。


如果有人需要这个编码类的话 可以到我的空间下载 我会上传上去的 。。。你也可以上网自己找。。呵呵呵呵呵

Base64.java的连接:http://download.csdn.net/my/uploads