android/IOS常用圖片上傳的兩種方式

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.