Android 通过Base64上传图片到服务器

来源:互联网 发布:屏幕亮点修复软件 编辑:程序博客网 时间:2024/05/01 08:09

之前做上传图片是采用HttpServlet上传,不过用了一下Base64上传图片后,感觉比HttpServlet方便很多,大家也可以跟着尝试一下。


前台图片处理:(传Bitmap对象即可)

/** * 通过Base32将Bitmap转换成Base64字符串 * @param bit * @return */public String Bitmap2StrByBase64(Bitmap bit){   ByteArrayOutputStream bos=new ByteArrayOutputStream();   bit.compress(CompressFormat.JPEG, 40, bos);//参数100表示不压缩   byte[] bytes=bos.toByteArray();   return Base64.encodeToString(bytes, Base64.DEFAULT);}


前台发送数据:(調用setImgByStr()方法,第一個參數imgStr 为Bitmap转成Base64的字符串,第二个参数imgName为图片的名字,包含后缀名.jpg

public static String host = "http://192.168.1.166:8080/ImageServer/";public static String getContent(String url) throws Exception {StringBuilder sb = new StringBuilder(); HttpClient client = new DefaultHttpClient();HttpParams httpParams = client.getParams();// 设置网络超时参数HttpConnectionParams.setConnectionTimeout(httpParams, 3000);HttpConnectionParams.setSoTimeout(httpParams, 5000);HttpResponse response = client.execute(new HttpGet(url));HttpEntity entity = response.getEntity();if (entity != null) {BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"), 8192);String line = null;while ((line = reader.readLine()) != null) {sb.append(line + "\n");}reader.close();}return sb.toString();}public static HttpResponse post(Map<String, Object> params, String url) {HttpClient client = new DefaultHttpClient();HttpPost httpPost = new HttpPost(url);httpPost.addHeader("charset", HTTP.UTF_8);httpPost.setHeader("Content-Type","application/x-www-form-urlencoded; charset=utf-8");HttpResponse response = null;if (params != null && params.size() > 0) {List<NameValuePair> nameValuepairs = new ArrayList<NameValuePair>();for (String key : params.keySet()) {nameValuepairs.add(new BasicNameValuePair(key, (String) params.get(key)));}try {httpPost.setEntity(new UrlEncodedFormEntity(nameValuepairs,HTTP.UTF_8));response = client.execute(httpPost);} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (RuntimeException e) {e.printStackTrace();}} else {try {response = client.execute(httpPost);} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}return response;}public static Object getValues(Map<String, Object> params, String url) {String token = "";HttpResponse response = post(params, url);if (response != null) {try {token = EntityUtils.toString(response.getEntity());response.removeHeaders("operator");} catch (ParseException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}return token;}public static Object setImgByStr(String imgStr,String imgName){String url =  host+"channel-uploadImage.action";Map<String,Object> params = new HashMap<String, Object>();params.put("imgStr", imgStr);params.put("imgName", imgName);return getValues(params, url);}


后台接收数据:

public void uploadPhoto() {//获取存储路径HttpServletRequest request = ServletActionContext.getRequest();String path = ServletActionContext.getServletContext().getRealPath("/")+"upload";File file = new File(path);if(!file.exists()){file.mkdir();}String imgPath  = path + request.getParameter("imgName");String imgStr = request.getParameter("imgStr");boolean flag = string2Image(imgStr, imgPath);JacksonUtil.responseJSON(response, flag);}


后台图片处理:

/** * 通过BASE64Decoder解码,并生成图片 * @param imgStr 解码后的string */public boolean string2Image(String imgStr, String imgFilePath) {// 对字节数组字符串进行Base64解码并生成图片if (imgStr == null)return false;try {// Base64解码byte[] b = new BASE64Decoder().decodeBuffer(imgStr);for (int i = 0; i < b.length; ++i) {if (b[i] < 0) {// 调整异常数据b[i] += 256;}}// 生成Jpeg图片OutputStream out = new FileOutputStream(imgFilePath);out.write(b);out.flush();out.close();return true;} catch (Exception e) {return false;}}

OK ! 如果成功上传前端会接收到true ,反之失败false。希望对大家有所帮助!

11 1
原创粉丝点击