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

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

之前做上传图片是采用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。希望对大家有所帮助!

(0)

相关推荐

  • Android实现本地上传图片并设置为圆形头像

    先从本地把图片上传到服务器,然后根据URL把头像处理成圆形头像. 因为上传图片用到bmob的平台,所以要到bmob(http://www.bmob.cn)申请密钥. 效果图: 核心代码: 复制代码 代码如下: public class MainActivity extends Activity {         private ImageView iv;         private String appKey="";                //填写你的Applicatio

  • Android使用post方式上传图片到服务器的方法

    本文实例讲述了Android使用post方式上传图片到服务器的方法.分享给大家供大家参考,具体如下: /** * 上传文件到服务器类 * * @author tom */ public class UploadUtil { private static final String TAG = "uploadFile"; private static final int TIME_OUT = 10 * 1000; // 超时时间 private static final String CH

  • Android开发中调用系统相册上传图片到服务器OPPO等部分手机上出现短暂的显示桌面问题的解决方法

    要原因是主体样式设置的问题:这里把appTheme设置一个style即可: <item name="android:windowBackground">@color/white</item> <!--下面这个属性很重要,有时候会出现某些机型在调用系统相册的时候,短暂的出现手机桌面现象--> <item name="android:windowIsTranslucent">false</item> <i

  • Android Retrofit 2.0框架上传图片解决方案

    本文为大家分享了 Android Retrofit 2.0框架上传图片解决方案,具体内容如下 1.单张图片的上传 /** * 上传一张图片 * @param description * @param imgs * @return */ @Multipart @POST("/upload") Call<String> uploadImage(@Part("fileName") String description, @Part("file\&qu

  • 解决android有的手机拍照后上传图片被旋转的问题

    需求:做仿新浪发微博的项目,能够上传图片还有两外一个项目用到手机拍摄图片,这两个都需要把图片上传到服务器 遇到问题:有的手机拍摄的图片旋转90度,有的图片旋转了180度,有的手机是正常的,服务器要求的是正的,这样问题就来了,不能用户发个照片在微博上看到的是被旋转了的啊,另外一个项目里旋转了的图片直接匹配出现问题,这个更严重. 解决:开始的时候在网上没有找到很好的解决办法,谷歌百度的搜了一通,想到第一种解决方式,当手机拍照结束,在返回结果处理里面立即跳转到一个新的页面,在新的页面里让用户自己手动去

  • android上传图片到PHP的过程详解

    今天在做上传头像的时候,总是提交连接超时错误,报错信息如下:XXXXXXSokcetTimeOutXXXXXXXX 然后自己设置HTTP的超时时间: 复制代码 代码如下: [java] view plaincopyprint? //设置超时时间  httpclient.setTimeout(20000); 再building,runing,还是不行....这就怪了,明明好好的,怎么会突然就变成连接超时了呢!又折腾了一阵子后,也跟后台那边的朋友沟通过,他也测试了上传接口,发现没什么问题,就让我自己

  • android实现上传本地图片到网络功能

    本文实例为大家分享了android上传本地图片到网络的具体代码,供大家参考,具体内容如下 首先这里用到了Okhttp 所以需要一个依赖: compile 'com.squareup.okhttp3:okhttp:3.9.0' xml布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res

  • Android异步上传图片到PHP服务器

    原理 Android客户端模拟一个HTTP的Post请求到服务器端,服务器端接收相应的Post请求后,返回响应信息给给客户端. 背景 网上很多上传到java服务器上的,找了好久,找到了上传到php的了,思路跟我当初想的差不多,就是POST过去.废话不多说,直接上图看代码. php代码 <?php $target_path = "./upload/";//接收文件目录 $target_path = $target_path . basename( $_FILES['uploaded

  • Android使用OkHttp上传图片的实例代码

    简介 上传图片是一个APP的常见功能,可以是通过OOS上传到阿里云,也可以直接上传到Server后台,OOS有提供相应的SDK,此处忽略.下面通过OkHttp来实现图片的上传 代码 直接上代码UploadFileHelper.kt object UploadFileHelper { //--------ContentType private val MEDIA_OBJECT_STREAM = MediaType.parse("multipart/form-data") //------

  • Android 开发 使用WebUploader解决安卓微信浏览器上传图片中遇到的bug

    先给大家分析下微信浏览器上传图片bug的原因 微信在新版本中采用的是自己的X5内核浏览器,而在较老的版本中还有可能是安卓的原生浏览器.具体的环境我也不太了解,但是经过实际多台安卓机型的测试,我采取的方案可以基本确保在安卓机中微信浏览器的成功上传.苹果机型没问题,因为微信的ios客户端使用的是Safari的内核,没有各种坑,且效果最好. 这里给出一个 WebUploader 官方关于移动端适配的 issues 链接.里面提供的方法确实有效,但就是解决的方案并没有很清楚的展示出来,从该issues中

随机推荐