结合sae,thinkphp完成头像的更改与上传

步骤:

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设置为选中的图片;

然后将返回的图片取出,并设置给相应的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.提交方式为POST2.服务器接口。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会自动替换,所以不用添加删除步骤。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值