Base64Coder方式实现android向jsp服务器后台上传图片

android端(上代码):

package org.txlian.rightbut;


import java.io.ByteArrayOutputStream;
import java.io.File;

import org.txlian.myapp.R;
import org.txlian.userinfo.Base64Coder;
import org.txlian.webutil.WebUtil;

import android.R.anim;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

public class AddTalkDialog extends Activity {
 //private MyDialog dialog;
 private LinearLayout layout;
 private EditText inwhere = null;
 private EditText dowhat = null;
 private EditText status = null;
 private ImageView photo = null;
 private Button add = null;
 private String tp = null;
 
 private WebUtil webUtil = null;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.addtalk_dialog);
  //dialog=new MyDialog(this);
  layout=(LinearLayout)findViewById(R.id.addtalk_main_dialog_layout);
  layout.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View v) {
    Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!",
      Toast.LENGTH_SHORT).show(); 
   }
  });
  inwhere=(EditText)findViewById(R.id.addtalk_inwhere);
  status=(EditText)findViewById(R.id.addtalk_status);
  dowhat=(EditText)findViewById(R.id.addtalk_dowhat);
  photo=(ImageView)findViewById(R.id.addtalk_photo);
  photo.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View v) {
    ShowPickDialog();
   }
  });
  add=(Button)findViewById(R.id.addtalk_btn_ok);
  this.add.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View v) {
    webUtil = new WebUtil();
    int stau = webUtil.addPoster(AddTalkDialog.this.inwhere
      .getText().toString(), AddTalkDialog.this.dowhat
      .getText().toString(), AddTalkDialog.this.status
      .getText().toString(), tp);//发起http请求发送图片参数*注意一点很重要的事情:tp这个参数需要URLEncoder.encode(tp, "utf-8");要不包含了特殊字符会出错;
    AddTalkDialog.this.finish();

   }
  } );
  
 }

 
 
 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
  if(keyCode == KeyEvent.KEYCODE_BACK) {
   this.exitDialog() ;
  }
  return false ;
 }

    private void exitDialog(){
     new AlertDialog.Builder(this)
  .setTitle("是否要取消发布?")
  .setNegativeButton("是", new DialogInterface.OnClickListener() {
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
    AddTalkDialog.this.finish();
   }
  })
  .setPositiveButton("否", new DialogInterface.OnClickListener() {
   public void onClick(DialogInterface dialog, int whichButton) {
    dialog.dismiss();
   }
  }).show();
    }

 @Override
 public boolean onTouchEvent(MotionEvent event){
  this.exitDialog();
  return false;
 }
 
 
 
 /**
  * 选择提示对话框
  */
 private void ShowPickDialog() {
  new AlertDialog.Builder(this)
    .setTitle("选择...")
    .setNegativeButton("相册", new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dialog, int which) {
      dialog.dismiss();
    
      Intent intent = new Intent(Intent.ACTION_PICK, null);
      
      intent.setDataAndType(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
        "image/*");
      startActivityForResult(intent, 1);

     }
    })
    .setPositiveButton("拍照", new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dialog, int whichButton) {
      dialog.dismiss();
     
      Intent intent = new Intent(
        MediaStore.ACTION_IMAGE_CAPTURE);
      //下面这句指定调用相机拍照后的照片存储的路径
      intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri
        .fromFile(new File(Environment
          .getExternalStorageDirectory(),
          "xiaoma.jpg")));
      startActivityForResult(intent, 2);
     }
    }).show();
 }
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  switch (requestCode) {
  // 如果是直接从相册获取
  case 1:
   if(data!=null){
   startPhotoZoom(data.getData());
   }
   break;
  // 如果是调用相机拍照时
  case 2:
   File temp = new File(Environment.getExternalStorageDirectory()
     + "/xiaoma.jpg");
   startPhotoZoom(Uri.fromFile(temp));
   break;
  // 取得裁剪后的图片
  case 3:
   /**
    * 非空判断大家一定要验证
    *
    */
   if(data != null){
    setPicToView(data);
   }
   break;
  default:
   break;

  }
  super.onActivityResult(requestCode, resultCode, data);
 }
 
 /**
  * 裁剪图片方法实现
  * @param uri
  */
 public void startPhotoZoom(Uri uri) {

  Intent intent = new Intent("com.android.camera.action.CROP");
  intent.setDataAndType(uri, "image/*");
  intent.putExtra("crop", "true");
  // aspectX aspectY 是宽高的比例
  intent.putExtra("aspectX", 1);
  intent.putExtra("aspectY", 1);
  // outputX outputY 是裁剪图片宽高
  intent.putExtra("outputX", 150);
  intent.putExtra("outputY", 150);
  intent.putExtra("return-data", true);
  startActivityForResult(intent, 3);
 }
 /**
  * 保存图片数据
  * @param picdata
  */
 private void setPicToView(Intent picdata) {
  Bundle extras = picdata.getExtras();
  if (extras != null) {
   Bitmap photo = extras.getParcelable("data");
   Drawable drawable = new BitmapDrawable(photo);
   
   /**
    * 下面注释的方法是将裁剪之后的图片以Base64Coder的字符方式上
    * 传到服务器
    */
   
   ByteArrayOutputStream stream = new ByteArrayOutputStream();
   photo.compress(Bitmap.CompressFormat.JPEG, 60, stream);
   byte[] b = stream.toByteArray();
   // 将图片流以字符串形式存储下来
   
      tp = new String(Base64Coder.encodeLines(b));
   /*这个地方大家可以写下给服务器上传图片的实现,直接把tp直接上传就可以了,
   服务器处理的方法是服务器那边的事了
   
   如果下载到的服务器的数据还是以Base64Coder的形式的话,可以用以下方式转换
   为我们可以用的图片类型就OK啦.
   Bitmap dBitmap = BitmapFactory.decodeFile(tp);
   Drawable drawable = new BitmapDrawable(dBitmap);
   */
   AddTalkDialog.this.photo.setImageDrawable(drawable);//show image on page
  }
 }
}


服务器端(上代码):

public void addImg() {
  User user = (User) ServletActionContext.getContext().getSession()
    .get("LOGIN");
  if (talkImg != null && talkImg.length() > 0&&!talkImg.equals("null")) {
   String imgname = (new Date()).toString().replace(" ", "")
     .replace(":", "");
   androidUploadImg(talkImg, "/txlian/talkimg/" + imgname + ".jpg",
     400);//服务器对图片裁剪方法
   talk.setImgSrc("/txlian/talkimg/" + imgname + ".jpg");
  }else{
   talk.setImgSrc("");
  }
  if (talk.getInwhere().length() > 0 && talk.getDowhat().length() > 0
    && talk.getContent().length() > 0) {
   talkService.addTalk(user, talk);
   sendJsonMsg(1, "发布成功!");
  } else {
   sendJsonMsg(0, "发布失败!");
  }

 }


以上借鉴了小马同志的资源,铁磁感谢;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值