最近做一个项目,要从相册或者手机拍照上传图片到服务器。这里写一篇关于上传图片时运到的各种问题,以及如何上传成功。
1. 将获取的图片转化为bitmap。
2. 将得到的bitmap通过base64格式转化为字符串。
3. 然后调用webservice接口,将字符串上传个服务器,一般还会获取webservice返回的uri。
但是一定要注意的一点是当上传的图片比较大时,可能会导致上传失败,因此要对图片先进行压缩处理之后再上传。
下面通过一个实例:
public class BitmapAndStringUtils {
/**
* 图片转成string
*
* @param bitmap
* @return
*/
public static String convertIconToString(Bitmap bitmap)
{
// String string = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();// outputstream
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
/* byte[] appicon = baos.toByteArray();// 转为byte数组
return Base64.encodeToString(appicon, Base64.DEFAULT);*/
int options = 100;
while ( baos.toByteArray().length / 1024>1000) { //循环判断如果压缩后图片是否大于1000kb,大于继续压缩
baos.reset();//重置baos即清空baos
bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
options -= 10;//每次都减少10
Log.i("Compress",baos.toByteArray().length+"");
}
byte[] bytes = baos.toByteArray();
// string = Base64.encode(bytes);
return Base64.encodeToString(bytes, Base64.DEFAULT);
/*String string = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
int options = 100;
while ( baos.toByteArray().length / 1024>100) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩
baos.reset();//重置baos即清空baos
bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
options -= 10;//每次都减少10
}
byte[] bytes = baos.toByteArray();
string = Base64.encode(bytes);
return string; */
}
}
其中BitmapAndStringUtils中的convertIconToString(Bitmap bitmap)是将图片转化为字符串并且进行public class MainActivity extends AppCompatActivity {
private String path=”“,Picture;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Bitmap photo1 = BitmapFactory.decodeFile(path);
Picture = BitmapAndStringUtils.convertIconToString(photo1);
UploadUserPicture(Picture);
}
private void UploadUserPicture(String picture) {
//调用webservice接口上传图片
}
}UploadUserPicture(String picture)是调用webservice接口上传图片。
Path是图片的路径。
int options = 100;
while ( baos.toByteArray().length / 1024>1000) { //循环判断如果压缩后图片是否大于1000kb,大于继续压缩
baos.reset();//重置baos即清空baos
bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
options -= 10;//每次都减少10
Log.i("Compress",baos.toByteArray().length+"");
}
byte[] bytes = baos.toByteArray();
// string = Base64.encode(bytes);
return Base64.encodeToString(bytes, Base64.DEFAULT);
/*String string = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
int options = 100;
while ( baos.toByteArray().length / 1024>100) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩
baos.reset();//重置baos即清空baos
bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
options -= 10;//每次都减少10
}
当图片过大的时候上面的压缩算法可能会有问题。当循环压缩10次后图片大小还大于1000kb时,程序就会崩溃因为options的值此时小于0。