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; } } |
就这样两种上传图片的方式就结束了,当然第一种我是重点讲了一下原理,配置服务端的没有详细的给出,这块我想是值得我们去研究研究的,有共同需求的可以一起交流,研究,分享。
转载于:https://blog.51cto.com/wyong/1535648