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: p_w_picpath/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; 
       } 
      
}

 

     就这样两种上传图片的方式就结束了,当然第一种我是重点讲了一下原理,配置服务端的没有详细的给出,这块我想是值得我们去研究研究的,有共同需求的可以一起交流,研究,分享。