顯示web端servlet向android端傳輸二進位格式圖片

來源:互聯網
上載者:User

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

我的思路是將圖片轉成二進位流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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.