码迷,mamicode.com
首页 > 移动开发 > 详细

手机选取图片上传到服务器

时间:2015-11-06 00:04:40      阅读:368      评论:0      收藏:0      [点我收藏+]

标签:

  初学安卓四个月不到的我,可能入门也算不上。边学边摸索,慢慢地能在百度上找到正确的能用的代码了,这应该就是我学这么久得到的进步了。

  今天花了一天的时间,实现了上传头像和更改头像的功能。大部分的代码都是copy过来的,大概能看懂,知道怎么用,仅此!

  好的,忙了一天,做个自我总结~

在这里先总结上传头像功能的实现:

    思路:

    创建一个activity,简单的关联一个有imageView和button的布局。当点击imageView的时候,弹出一个dialog,该dialog可以调用系统的拍照、相册,这样就可以实现选择要上传的图片了,然后再调用系统裁剪,图片裁剪好将图片显示在imageView中;当点击button的时候,就执行上传的功能。

    (哦,需要说明的是,这里用了xUtils来处理http请求,从而实现上传。所以需要xUtils架包,因为要请求网络和访问手机sd卡,所以也不要忘了加对应的权限。对了,这里还实现了将裁剪好的图片保存在手机sd卡的功能。)

代码部分:

一、客户端

//①onCreate部分
private ImageView img;
private Button btnUpload;
private HttpUtils httpUtils;

private String URL="http://10.50.8.33:8080/Person_proj/servlet/UploadServlet";//服务器路径

private String[] items = { "拍照", "相册" };
private String title = "选择照片";

private static final int PHOTO_CARMERA = 1;
private static final int PHOTO_PICK = 2;
private static final int PHOTO_CUT = 3;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

img = (ImageView) findViewById(R.id.main_img);
btnUpload = (Button) findViewById(R.id.upload);//上传图片的按钮
btnUpload.setOnClickListener(clickListener);
img.setOnClickListener(clickListener);

httpUtils=new HttpUtils(10000);// 创建并实例化HttpUtils类

}

//②点击事件的监听

private OnClickListener clickListener = new OnClickListener() {

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.main_img://imageView监听
AlertDialog.Builder dialog = AndroidUtil.getListDialogBuilder(//这里调用了 AndroidUtil的静态方法,所以需要再写一个类(加在后面)
MainActivity.this, items, title, dialogListener);//弹出dialog,其中items、title可以自定义,这里将其定义成全局变量;

                      //dialogListener是对该dialog的监听(监听选择照片的方式:拍照、相册)
dialog.show();
break;
case R.id.upload://上传图片按钮监听
upload();//调用上传方法
break;

default:
break;
}

}
};

//③上传方法(上传到服务器)

protected void upload() {
RequestParams params=new RequestParams();
params.addBodyParameter(tempFile.getPath().replace("/", ""), tempFile);//这里的tempFile的创建以当前系统时间为名称,防止重复

                                    //防止重复的目的:使得每个用户都获取到自己上传的头像
System.out.println(tempFile);
httpUtils.send(HttpMethod.POST,URL, params,new RequestCallBack<String>() {

@Override
public void onFailure(HttpException e, String msg) {
Toast.makeText(MainActivity.this, "上传失败,检查一下服务器地址是否正确", Toast.LENGTH_SHORT).show();
Log.i("MainActivity", e.getExceptionCode() + "====="
+ msg);
}

@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
Toast.makeText(MainActivity.this, "上传成功,马上去服务器看看吧!", Toast.LENGTH_SHORT).show();
Log.i("MainActivity", "====upload_error====="
+ responseInfo.result);
}
});
}

 

//④tempFile的创建(该方法我是放在onCreate方法前面,放在后面应该也没有关系)

// 创建一个以当前系统时间为名称的文件,防止重复
private File tempFile = new File(Environment.getExternalStorageDirectory(),
getPhotoFileName());

// 使用系统当前日期加以调整作为照片的名称
private String getPhotoFileName() {
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat sdf = new SimpleDateFormat("‘PNG‘_yyyyMMdd_HHmmss");
picname=sdf.format(date) + ".png";

return sdf.format(date) + ".png";
}

 

//⑤dialog的监听(这里调用的方法有好几个)

private android.content.DialogInterface.OnClickListener dialogListener = new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {//case的变量值,定义成了全局变量
case 0://数组items的下标值,这里的当然是拍照
// 调用拍照
startCamera(dialog);
break;
case 1:
// 调用相册
startPick(dialog);
break;

default:
break;
}
}
};

// 调用系统相机
protected void startCamera(DialogInterface dialog) {
dialog.dismiss();
// 调用系统的拍照功能
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra("camerasensortype", 2); // 调用前置摄像头
intent.putExtra("autofocus", true); // 自动对焦
intent.putExtra("fullScreen", false); // 全屏
intent.putExtra("showActionIcons", false);
// 指定调用相机拍照后照片的存储路径
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
startActivityForResult(intent, PHOTO_CARMERA);
}

// 调用系统相册
protected void startPick(DialogInterface dialog) {
dialog.dismiss();
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
startActivityForResult(intent, PHOTO_PICK);
}

//重写返回结果码方法:选好图片之后再回到界面,对应显示选好的图片

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {//这里的case变量值,定义为全局变量
case PHOTO_CARMERA://拍照方式
startPhotoZoom(Uri.fromFile(tempFile), 300);//调用裁剪方法
break;
case PHOTO_PICK://相册方式
if (null != data) {
startPhotoZoom(data.getData(), 300);//调用裁剪方法
}
break;
case PHOTO_CUT://图片裁剪成功
if (null != data) {
setPicToView(data);//将图片显示在ImageView上
}
break;

default:
break;
}
super.onActivityResult(requestCode, resultCode, data);
}

// 调用系统裁剪
private void startPhotoZoom(Uri uri, int size) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// crop为true是设置在开启的intent中设置显示的view可以裁剪
intent.putExtra("crop", true);
// aspectX,aspectY是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX,outputY是裁剪图片的宽高
intent.putExtra("outputX", size);
intent.putExtra("outputY", size);
// 设置是否返回数据
intent.putExtra("return-data", true);
startActivityForResult(intent, PHOTO_CUT);
}

// 将裁剪后的图片显示在ImageView上
private void setPicToView(Intent data) {
Bundle bundle = data.getExtras();
if (null != bundle) {
final Bitmap bmp = bundle.getParcelable("data");
img.setImageBitmap(bmp);

saveCropPic(bmp);//调用保存在sdcard方法(也可以不保存,或者保存在手机本地)
Log.i("MainActivity", tempFile.getAbsolutePath());

}
}


// 把裁剪后的图片保存到sdcard上
private void saveCropPic(Bitmap bmp) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
FileOutputStream fis = null;
bmp.compress(Bitmap.CompressFormat.PNG, 100, baos);
try {
fis = new FileOutputStream(tempFile);
fis.write(baos.toByteArray());
fis.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != baos) {
baos.close();
}
if (null != fis) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

// AndroidUtil类

public class AndroidUtil {

// 返回一个列表对话框
public static AlertDialog.Builder getListDialogBuilder(Context context,
String[] items, String title, OnClickListener clickListener) {
return new AlertDialog.Builder(context).setTitle(title).setItems(items, clickListener);

}
}

 

二、服务器端(UploadServlet)

 

public class AndroidUploadServlet extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
SmartUpload smartUpload = new SmartUpload();
String msg=request.getParameter("msg");
out.print(msg);
try {
smartUpload.initialize(this.getServletConfig(), request, response);
smartUpload.upload();
com.jspsmart.upload.File smartFile = smartUpload.getFiles().getFile(0);
if (!smartFile.isMissing()) {
String saveFileName = "images/" + smartFile.getFileName(); //图片保存在webroot目录下的images文件夹下

smartFile.saveAs(saveFileName, smartUpload.SAVE_VIRTUAL);
System.out.println("ok:" + saveFileName+ ", msg:" + smartUpload.getRequest().getParameter("msg"));
} else {
out.print("missing...");
}
} catch (Exception e) {
System.out.println(e+","+msg);
}
out.flush();
out.close();
}

}

 

我人生中第一篇博客,到此结束~耶耶~~改天总结从服务器获取图片显示在客户端。

 

手机选取图片上传到服务器

标签:

原文地址:http://www.cnblogs.com/f-l-j-123/p/4941121.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!