我們項目組的組長居然要將圖片轉成二進位流存到資料庫內~~。。。我去。。。極度不贊同啊。哎個人意見是將圖片上傳到伺服器端,將圖片資源儲存儲存到伺服器端的磁碟上,資料庫儲存的只是圖片在服務端的路徑。。。。但。哎~~官大一級壓死人啊。。沒辦法唄~~只好動腦找資料,經過一天的奮鬥終於把這問題給解決咯~~呵呵呵
我的思路是將圖片轉成二進位流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