標籤:android 伺服器 上傳檔案 服務端 資料庫
android/IOS常用圖片上傳的兩種方式:
1、上傳到伺服器的檔案伺服器(FileServer)
原理:上傳到檔案伺服器的方式是先在伺服器端搭建檔案伺服器,配置好路徑(url),該路徑是我們待會上傳圖片的路徑,配置成功後便通過http+post的模式上傳到檔案伺服器,同時檔案伺服器將返回一個圖片ID,這個ID就是圖片的唯一標識,並將該ID寫入資料庫儲存,當需要下載該圖片時只需要將此ID帶上即可。
兩個核心問題:
(1)服務端:配置FileServer,並寫處理響應上傳圖片的代碼,這個值得去網上研究研究;
(2)客服端:寫Http上傳檔案的代碼,我貼一下上傳核心代碼:
/** * * @param params * 傳遞的普通參數 * @param uploadFile * 需要上傳的檔案名稱 * @param fileFormName * 需要上傳檔案表單中的名字 * @param newFileName * 上傳的檔案名稱,不填寫將為uploadFile的名稱 * @param urlStr * 上傳的伺服器的路徑 * @throws IOException */ public void uploadForm(Map<String, String> params, String fileFormName, File uploadFile, String newFileName, String urlStr, Context mContext) throws IOException { if (newFileName == null || newFileName.trim().equals("")) { newFileName = uploadFile.getName(); } StringBuilder sb = new StringBuilder(); /** * 普通的表單資料 */ if (params != null) for (String key : params.keySet()) { sb.append("--" + BOUNDARY + "\r\n"); sb.append("Content-Disposition: form-data; name=\"" + key + "\"" + "\r\n"); sb.append("\r\n"); sb.append(params.get(key) + "\r\n"); } /** * 上傳檔案的頭 */ sb.append("--" + BOUNDARY + "\r\n"); sb.append("Content-Disposition: form-data; name=\"" + fileFormName + "\"; filename=\"" + newFileName + "\"" + "\r\n"); sb.append("Content-Type: image/jpeg" + "\r\n");// 如果伺服器端有檔案類型的校正,必須明確指定ContentType sb.append("\r\n"); byte[] headerInfo = sb.toString().getBytes("UTF-8"); byte[] endInfo = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("UTF-8"); System.out.println(sb.toString()); URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); conn.setRequestProperty( "Content-Length", String.valueOf(headerInfo.length + uploadFile.length() + endInfo.length)); conn.setDoOutput(true); OutputStream out = conn.getOutputStream(); InputStream in = new FileInputStream(uploadFile); /**檔案總大小**/ onUploadProcessListener.initUpload((int)uploadFile.length()); out.write(headerInfo); byte[] buf = new byte[1024]; int len; int curLen = 0; //當前長度 while ((len = in.read(buf)) != -1){ out.write(buf, 0, len); curLen += len; /**上傳進度值的大小**/ onUploadProcessListener.onUploadProcess(curLen); } out.write(endInfo); in.close(); out.close(); String result = ""; int code = conn.getResponseCode(); if (code == 200) { System.out.println("上傳成功"); InputStream input = conn.getInputStream(); StringBuffer sb1 = new StringBuffer(); int ss; while ((ss = input.read()) != -1) { sb1.append((char) ss); } result = sb1.toString(); // 回調方法 sendMessage(1, result); saveUploadFile(mContext, result); } Toast.makeText(mContext, "上傳後返回的結果:" + result, 100).show(); } |
這裡的 result就是返回的圖片ID,代碼自己去看看,是類比瀏覽器的模式上傳的,如果不太明白的可以先瞭解一下瀏覽器的post模式。
2、上傳到伺服器的資料庫
原理:這個原理很簡單,就是將圖片用base64的方式加密後以參數的形式上傳到伺服器並直接寫入資料庫,需要用的時候直接擷取這個欄位並解密即可。
base64加密:
byte[] bPic = Tools.Bitmap2Bytes(bitmap); String mSkinImage = Base64Helper.encode(bPic); |
http+post+para上傳
List<BasicNameValuePair> pairs = new ArrayList<BasicNameValuePair>(); pairs.add(new BasicNameValuePair("SkinImage",mSkinImage)); //這裡是上傳 HttpHelper.getDataEncyption(Tools.getReqUrl(), pairs, mHandler); |
這種方式上傳成功後就直接插入資料庫了,我再貼出base64的加密和解密代碼:
public class Base64Helper { /** * 編碼加密 * @param byteArray * @return */ public static String encode(byte[] byteArray) { return new String(Base64.encodeToString(byteArray, Base64.DEFAULT)); } /** * 解碼-解密 * @param base64EncodedString * @return */ public static byte[] decode(String base64EncodedString) { byte[] bb = null; try { bb = Base64.decode(base64EncodedString, Base64.DEFAULT); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return bb; } } |
就這樣兩種上傳圖片的方式就結束了,當然第一種我是重點講了一下原理,佈建服務端的沒有詳細的給出,這塊我想是值得我們去研究研究的,有共同需求的可以一起交流,研究,分享。
本文出自 “吸博取精自我更新” 部落格,請務必保留此出處http://wyong.blog.51cto.com/1115465/1535648