图片上传到服务端,客户端+服务端的简单实现

以前看到一个功能是晃动手机上传照片到电脑上的应用,今天闲来无事就试着写了一下,可以实现选择照片上传,也可以拍照上传,把这个东东简单实现了一下,上传的方式是用字符的形式上传的,怎么把照片搞成字符有一个工具类可以实现,是什么类,代码里面有,是网上一找来的,个人感觉用起来非常不错。这个小Demo的手机晃动没有加入,如果有兴趣可以自己去加一下,其实也不难就是加一个晃动检测就能实现。下面来看服务端的主要代码:
代码非常简单就一个接收与写文件:

同学们如果调试的时候一定要注意看服务器的地址啊,我用的是本地局域网的IP地址,每个人的主机一般都不一样的。

最后求各种路过,各种留抓,各种讨论,洽洽

服务器代码:

package com.hexiaochun;
 
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import com.hexiaochun.utils.Base64Coder;
 
 
public class UpServer extends HttpServlet {
 
        private String file;
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                        throws ServletException, IOException {
//                super.doPost(req, resp);
                 
        }
         
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                        throws ServletException, IOException {
                file=req.getParameter("file");
                if(file!=null){
                        byte[] b= Base64Coder.decodeLines(file);
                        String filepath=req.getSession().getServletContext().getRealPath("/files");
                        File file=new File(filepath);
                        if(!file.exists())
                                file.mkdirs();
                        FileOutputStream fos=new FileOutputStream(file.getPath()+"/person_head"+(int)(Math.random()*100)+".png");
                        System.out.println(file.getPath());
                        fos.write(b);
                        fos.flush();
                        fos.close();
                }
        }
 
}


还用到一个工具类用来解释上传得到的字符串Base64Coder
客户端的代码与不多来看一下

package com.hexiaochun;
 
 
public class MainActivity extends Activity implements OnClickListener {
 
        // 服务器地址
        private static final String HOST = "http://192.168.1.105:8080/ImageServer/upServer";
        // 显示图片
        private ImageView image;
        // 两个but
        private Button take;
        private Button selete;
        // 记录文件名
        private String filename;
        // 上传的bitmap
        private Bitmap upbitmap;
        private Button up;
         
        //多线程通信
        private Handler myHandler;
        private ProgressDialog myDialog;
 
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                image = (ImageView) this.findViewById(R.id.imageView1);
                take = (Button) this.findViewById(R.id.take);
                selete = (Button) this.findViewById(R.id.selete);
                up=(Button)this.findViewById(R.id.up);
                take.setOnClickListener(this);
                selete.setOnClickListener(this);
                up.setOnClickListener(this);
 
                myHandler=new MyHandler();
        }
 
        public void onClick(View v) {
                Intent intent;
                switch (v.getId()) {
                case R.id.take:
                        intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        filename = "xiaochun" + System.currentTimeMillis() + ".jpg";
                        System.out.println(filename);
                        // 下面这句指定调用相机拍照后的照片存储的路径
                        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(
                                        Environment.getExternalStorageDirectory(), filename)));
                        startActivityForResult(intent, 1);
                        break;
                case R.id.selete:
                        intent = new Intent(Intent.ACTION_PICK, null);
                        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                                        "image/*");
                        startActivityForResult(intent, 2);
                        break;
                case R.id.up:
                        myDialog = ProgressDialog.show(this, "Loading...", "Please wait...", true, false);
                        new Thread(new Runnable() {
                                public void run() {
                                        upload();
                                        myHandler.sendMessage(new Message());
                                }
                        }).start();
                        break;
                default:
                        break;
                }
        }
 
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                // TODO Auto-generated method stub
                 
                switch (requestCode) {
                case 1:
                        //解成bitmap,方便裁剪
                        Bitmap bitmap=BitmapFactory.decodeFile(Environment.
                                        getExternalStorageDirectory().getPath()+"/"+filename);
                        float wight=bitmap.getWidth();
                        float height=bitmap.getHeight();
//                        ZoomBitmap.zoomImage(bitmap, wight/8, height/8);
                        image.setImageBitmap(ZoomBitmap.zoomImage(bitmap, wight/8, height/8));
                        upbitmap=ZoomBitmap.zoomImage(bitmap, wight/8, height/8);
                        break;
                case 2:
                        if(data!=null){
                                image.setImageURI(data.getData());
                                System.out.println(getAbsoluteImagePath(data.getData()));
                                upbitmap=BitmapFactory.decodeFile(getAbsoluteImagePath(data.getData()));
                                //剪一下,防止测试的时候上传的文件太大
                                upbitmap=ZoomBitmap.zoomImage(upbitmap, upbitmap.getWidth()/8, upbitmap.getHeight()/8);
                        }
                        break;
                default:
                        break;
                }
        }
 
        // 取到绝对路径
        protected String getAbsoluteImagePath(Uri uri) {
                // can post image
                String[] proj = { MediaStore.Images.Media.DATA };
                Cursor cursor = managedQuery(uri, proj, // Which columns to return
                                null, // WHERE clause; which rows to return (all rows)
                                null, // WHERE clause selection arguments (none)
                                null); // Order-by clause (ascending by name)
 
                int column_index = cursor
                                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                cursor.moveToFirst();
                return cursor.getString(column_index);
        }
 
        // 上传
        public void upload() {
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                upbitmap.compress(Bitmap.CompressFormat.JPEG, 60, stream);
                byte[] b = stream.toByteArray();
                // 将图片流以字符串形式存储下来
                String file = new String(Base64Coder.encodeLines(b));
                HttpClient client = new DefaultHttpClient();
                // 设置上传参数
                List<NameValuePair> formparams = new ArrayList<NameValuePair>();
                formparams.add(new BasicNameValuePair("file", file));
                HttpPost post = new HttpPost(HOST);
                UrlEncodedFormEntity entity;
                try {
                        entity = new UrlEncodedFormEntity(formparams, "UTF-8");
                        post.addHeader("Accept",
                                        "text/javascript, text/html, application/xml, text/xml");
                        post.addHeader("Accept-Charset", "GBK,utf-8;q=0.7,*;q=0.3");
                        post.addHeader("Accept-Encoding", "gzip,deflate,sdch");
                        post.addHeader("Connection", "Keep-Alive");
                        post.addHeader("Cache-Control", "no-cache");
                        post.addHeader("Content-Type", "application/x-www-form-urlencoded");
                        post.setEntity(entity);
                        HttpResponse response = client.execute(post);
                        System.out.println(response.getStatusLine().getStatusCode());
                        HttpEntity e = response.getEntity();
                        System.out.println(EntityUtils.toString(e));
                        if (200 == response.getStatusLine().getStatusCode()) {
                                System.out.println("上传完成");
                        } else {
                                System.out.println("上传失败");
                        }
                        client.getConnectionManager().shutdown();
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
         
        private class MyHandler extends Handler{
                @Override
                public void handleMessage(Message msg) {
                        myDialog.dismiss();
                }
        }
 
}

下面来看一下效果图:



界面控制那里还有点问题,不过不影响使用

源码包地址:

http://www.eoeandroid.com/thread-260957-1-1.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值