步骤:
1.登录后将头像下载至本地并对imageview设置该图片;
2.点击头像进行头像修改:跳转至手机相册等可以处理图片的应用;
3.选择好图片后返回原应用,将相应的imageview设置为选中的图片;
4.保存到指定文件夹,并替换原头像图片;
5.调用网络接口,将新的图片传入;
6.服务器端将图片保存至storage下相应的文件夹,替换原文件。
详细步骤:
1.登录后将头像下载至本地并对imageview设置该图片;
图片下在可以直接使用xutils中的httputils进行下载,一开始我使用的是bitmaputils对imageview进行直接赋值,然后通过imageview得到图片,但这个过程是异步,并且我没有找到监听bitmaputils的下载过程的方法,不能等到下载完毕后再从本地取值设置给imageview,所以可以使用httputils直接下载,在下载完成后的onSuccess方法中对imageview设置图片。具体代码如下:
final String avatar = MD5Utils.encode(userN); HttpUtils http = new HttpUtils(); final String savePath = GlobalContants.AVATAR_SAVE_PATH + avatar + ".jpg"; // 创建绝对路径为savePath的文件 File file = new File(savePath); if (file.exists()) { file.delete(); } String basePath = file.getParent(); File basePathFile = new File(basePath); if (!basePathFile.exists()) { basePathFile.mkdirs(); } HttpHandler handler = http.download(GlobalContants.AVATAR_URL + avatar + ".jpg", savePath, true, // 如果目标文件存在,接着未完成的部分继续下载。服务器不支持RANGE时将从新下载。 true, // 如果从请求返回信息中获取到文件名,下载完成后自动重命名。 new RequestCallBack<File>() { @Override public void onStart() { } @Override public void onLoading(long total, long current, boolean isUploading) { } @Override public void onSuccess(ResponseInfo<File> responseInfo) { profile_image.setImageDrawable(Drawable.createFromPath(savePath)); } @Override public void onFailure(HttpException error, String msg) { Log.e("onFailure", msg); } });完成以上后:本地存在用户的原始头像图片,并且在客户端的imageview设置了该图片。
2.点击头像进行头像修改:跳转至手机相册等可以处理图片的应用;
对该imageview设置点击事件,打开图片应用:
circleImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intent, 1); } });
3.选择好图片后返回原应用,将相应的imageview设置为选中的图片;
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { Uri uri = data.getData(); ContentResolver cr = this.getContentResolver(); Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri)); profile_image.setImageBitmap(bitmap);}}
4.保存到指定文件夹,并替换原头像图片;
//将图片保存至本应用文件夹下 File file = new File(savePath); if (file.exists()) { file.delete();//删除原文件 } // 得到父文件夹地址,如果父文件夹不存在则创建 String basePath = file.getParent(); File basePathFile = new File(basePath); if (!basePathFile.exists()) { basePathFile.mkdirs(); } File myCaptureFile = new File(savePath); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile)); bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos); bos.flush(); bos.close(); } catch (Exception e) { }
5.调用网络接口,将新的图片传入;
通过post方式将图片提交到服务器
//上传更改的头像文件到服务器 RequestParams params = new RequestParams(); //file为服务器端拿到该文件的标示 params.addBodyParameter("file", new File(savePath)); HttpUtils http = new HttpUtils(); /*1.提交方式为POST。2.服务器接口。3.传入提交的参数*/ http.send(HttpRequest.HttpMethod.POST, "http://anytimelihao.sinaapp.com/jike/index.php/Home/Submit/", params, new RequestCallBack<String>() { @Override public void onStart() { } @Override public void onLoading(long total, long current, boolean isUploading) { } @Override public void onSuccess(ResponseInfo<String> responseInfo) { } @Override public void onFailure(HttpException error, String msg) { } });服务器采用的thinkphp进行文件上传处理,代码如下:这段代码是从网络上找的,然后自己改的,存在着一些问题,但是可以上传成功,我不太懂PHP。。。。
<?php
namespace Home\Controller;
use Think\Controller;
class SubmitController extends Controller {
public function index(){
$config = array(
'maxSize' => 3145728,
'exts'=>array('jpg', 'gif', 'png', 'jpeg'),
'replace'=>true, //表示当上传文件名相同时替换原文件
'rootPath'=>'./public/', //服务器保存文件的根目录
'savePath' => 'avatar/', //服务器保存文件的子目录
'saveName' => '', //设置为空表示文件命名为原文件名
'autoSub'=>false
);
$upload = new \Think\Upload($config);
//$_FILES['file']获取到POST提交的文件
//$_FILES['file']['name'];获取文件名
//$_FILES['file']['type'];获取文件类型
//$_FILES['file']['size'];获取文件大小,单位byte
//$_FILES['file']['error'];获取文件上传过程中的错误信息
// 上传文件
$info = $upload->uploadOne($_FILES['file']);
if(!$info) {// 上传错误提示错误信息
$this->error($upload->getError());
}else{// 上传成功
//$this->success(' 上传成功! ');
$data['imgUrl'] = "http://anytimelihao-public.stor.sinaapp.com/avatar/".$name; //生成文件目录路径
$imgUrl = M('Case');
$result = $imgUrl->create();
if(!$imgUrl->add($data)){
$this->error("添加图片失败!正在跳转",U('caseList'));
}else{
//dump($info);
$this->success("添加图片成功!正在跳转",U('caseList'));
}
}
}
}
6.服务器端将图片保存至storage下相应的文件夹,替换原文件。
完成以上步骤后就可以将新的图片存入服务器的storage下的public/avatar/下,因为我的客户端在保存头像时的命名规则都是通过将用户名进行MD5编码然后当做头像图片的名称,所以需要替换原来的文件,好在新浪sae会自动替换,所以不用添加删除步骤。