Android中上传图片到服务器详解

最近做一个项目,要从相册或者手机拍照上传图片到服务器。这里写一篇关于上传图片时运到的各种问题,以及如何上传成功。
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。

©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页