更新于 
部分信息可能已经过时,请谨慎参考本文内容。

上传本地图片到服务器详解

通过思路实现上传服务器逻辑

思路

回调图片path并解码为bitmap
将得到的bitmap通过base64格式转化为字符串
通过服务器对应接口get/post 参数携带其字符串

实现

回调解码

bitmap为解码位图 imgPath为回调path

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
private String imgPath;
private Bitmap bitmap;
public void loadImage() {
//调用相册中选择图片
Intent galleryIntent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(galleryIntent, RESULT_LOAD_IMG);
}

//返回被选择图片结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try {
if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK && null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
// 获取游标
Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
imgPath = cursor.getString(columnIndex);
cursor.close();
imXsFirstImage.setVisibility(View.VISIBLE);
bitmap = BitmapFactory.decodeFile(imgPath);
imXsFirstImage.setImageBitmap(bitmap);
} else {
L.t(getResources().getString(R.string.You_havenot_picked_Image));
}
} catch (Exception e) {
L.t(getResources().getString(R.string.Something_went_wrong));
}
}
bitmap与base64互转
位图转为字符串
1
2
3
4
5
6
7
8
9
10
11
12
/**
* 将bitmap转为base64字符串
* @param bitmap bitmap位图
* @param quality 80表示压缩掉20%
* @return base64字符串
*/
public String TurnBitmapBase(Bitmap bitmap) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);
byte[] bytes = bos.toByteArray();
return Base64.encodeToString(bytes, Base64.DEFAULT);
}
字符串转为位图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 将base64字符串转为bitmap位图
* @param base_bitmap 服务端回调base64字符串
* @return bitmap位图
*/
public Bitmap TurnBaseBitmap(String base_bitmap) {
byte[] byteIcon = Base64.decode(base_bitmap, Base64.DEFAULT);
for (int i = 0; i < byteIcon.length; ++i) {
if (byteIcon[i] < 0) {
byteIcon[i] += 256;
}
}
Bitmap bitmap = BitmapFactory.decodeByteArray(byteIcon, 0, byteIcon.length);
return bitmap;
}

​ 字符串转为位图: 运用于通过服务器接口将其获取到的值通过其进行转码为位图 便于显示
​ 位图转为字符串: 运用于将其数据通过接口传值(我这边用的是数据库表存 方便上传之后 客户端还可以显示其内容)