zoukankan      html  css  js  c++  java
  • 简单的图片上传和下载

    一.图片的上传

    1.图片的来源无非是照相和图库的选择 将选择的图片进行封装到bean类中进行返回,之后通过上传的方式去上传

    2.上传的方式也是两种方式,通过的字符串或者流的方式(先建立链接在通过流)

    3.服务器返回的数据是上传成功与否的标识

    4.使用框架进行上传。如:okhttp,xUtils,volley等等;

    二.图片的下载

    1.三级缓存()

    2.第三方框架

    更多的了解:http://blog.sina.com.cn/s/blog_9ac333de0101gptn.html
          http://blog.csdn.net/u011240877/article/details/45824855

    补充:

    图片上传的方法:

    直接从项目中copy的,可以参考这块的思路

    在gridView上进行展示上传的个数

        public class GridAdapter extends BaseAdapter {
            private LayoutInflater inflater; // 视图容器
            private int selectedPosition = -1;// 选中的位置
            private boolean shape;

            public boolean isShape() {
                return shape;
            }

            public void setShape(boolean shape) {
                this.shape = shape;
            }

            public GridAdapter(Context context) {
                inflater = LayoutInflater.from(context);
            }

            // 从新加载并且上传新的多余的图片
            public void update1() {
                loading1();
            }
            public int getCount() {
                return (Bimp.bmp.size() + 1);
            }

            public Object getItem(int arg0) {

                return null;
            }

            public long getItemId(int arg0) {

                return arg0;
            }

            public void setSelectedPosition(int position) {
                selectedPosition = position;
            }

            public int getSelectedPosition() {
                return selectedPosition;
            }

            /**
             * ListView Item设置
             */
            public View getView(int position, View convertView, ViewGroup parent) {
                // final int coord = position;
                ViewHolder holder = null;

                if (convertView == null) {
                    convertView = inflater.inflate(R.layout.item_published_grida,
                            parent, false);
                    holder = new ViewHolder();
                    holder.image = (ImageView) convertView
                            .findViewById(R.id.item_grida_image);
                    holder.customView = (CustomView6) convertView
                            .findViewById(R.id.customView);
                    convertView.setTag(holder);
                } else {
                    holder = (ViewHolder) convertView.getTag();
                }

                // customViewList.get(0).setVisibility(View.GONE);
                holder.image.setVisibility(View.VISIBLE);
                holder.customView.setProgress(0);
                holder.customView.setVisibility(CustomView6.VISIBLE);

                if (position == Bimp.bmp.size()) {

                    holder.image.setImageBitmap(BitmapFactory.decodeResource(
                            getResources(), R.drawable.icon_addpic_unfocused));
                    holder.customView.setVisibility(CustomView6.GONE);

                } else {
                    holder.image.setImageBitmap(Bimp.bmp.get(position));
                }

                // 是否存在key(适用于拍照)
                // 只要有选择照片的就会进来(包括第一次是选择照片)
                if(Bimp.drr != null && Bimp.drr.size() > position){
                    if (Bimp.listtag != null && Bimp.listtag.size() > position) {
                    // 有上传成功的照片时会走
                    if (pictureTypeMap.containsKey(Bimp.drr.get(position).uuid)) {
                        
                        if ("T".equals(pictureTypeMap.get(Bimp.drr.get(position).uuid))){
                            //角标越界
                            if (Bimp.listtag.size() > position) {
                                
                                if (Bimp.listtag.get(position).equals(Bimp.drr.get(position).uuid)) {
                                    
                                    holder.customView.setProgress(100);
                                
                                }
                            }
                        }
                    }
                }

                    
                }
                if (position >= 9) {
                    holder.image.setVisibility(View.GONE);
                    cameraBtn.setVisibility(View.GONE);
                    if (Selected == 9) {
                        Toast.makeText(FieldInspecRegisterActivity.this,
                                "单次最大上传图片为9张", 0).show();
                    }

                }

                return convertView;
            }
        }
        public class ViewHolder {
            public ImageView image;
            public CustomView6 customView;
        }
        //根据返回的集合的内容来展示图片
        private void loading1() {
            new Thread(new Runnable() {
                public void run() {
                    while (true) {
                        if (Bimp.max == Bimp.drr.size()) {
                            Message message = new Message();
                            message.what = CHANGDATA;
                            handler.sendMessage(message);
                            break;
                        } else {
                            try {
                                String path = Bimp.drr.get(Bimp.max).path;
                                Bitmap bm = Bimp.revitionImageSize(path);
                                Bimp.bmp.add(bm);
                                String newStr = path.substring(
                                        path.lastIndexOf("/") + 1,
                                        path.lastIndexOf("."));
                                FileUtils.saveBitmap(bm, "" + newStr);
                                Bimp.max += 1;
                                Message message = new Message();
                                message.what = CHANGDATA;
                                handler.sendMessage(message);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }).start();
        }
        //监听物理返回键
        public boolean onKeyDown(int keyCode, KeyEvent event) {

            if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
                
                if (Bimp.drr.size() > 0 && Selected < Bimp.drr.size()) {
                    //整在上传时进行对话框判断是否终止
                    showMyDialog();
                } else {
                    if (attendance.getType().equals("back")) {
                        finish();
                    } else {
                        if (!(Bimp.drr.size() > Selected)) {
                            //上传的完成时
                            uploadPicStr();
                        }
                    }
                }
            }
            return super.onKeyDown(keyCode, event);
        }
        //当界面返回时调用改方法,adapter适配
        protected void onRestart() {
            adapter2.update1();
            super.onRestart();
        }
        // 界面销毁时,有数据需要清除
        protected void onDestory() {
            //广播注销
            unregisterBroadcastReceiver();
            
            if (Bimp.drr.size() > 0) {
                Bimp.drr.clear();
            }
            if (Bimp.listtag.size() > 0) {
                Bimp.listtag.clear();
            }
            if (Bimp.bmp.size() > 0) {
                Bimp.bmp.clear();
            }

            FileUtils.deleteDir();
            Bimp.max = 0;
            Bimp.act_bool = false;

            }
        //
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            // 拍照
            if (resultCode == RESULT_OK && (requestCode == PHOTO_GRAPH )) {
                
                PhotoSelect++;
                //拿到路径再次请求上传
                if (picture.getAbsolutePath().length() > 0) {
                    //每次拿到给定图片的对象
                    UUID randomUUID = UUID.randomUUID();
                    BeanPicUpload mbeanPicUpload = new BeanPicUpload();
                    mbeanPicUpload.path=picture.getAbsolutePath();
                    mbeanPicUpload.uuid = randomUUID+"";
                    mbeanPicUpload.isSussecs=true;
                    Bimp.drr.add(mbeanPicUpload);
                    
                }    
            }
        }
        /**
         * 上传图片
         * 在生命止周期的方法去做
         * 每次返回到当前的界面时就会执行上传的方法
         * 这个方法在子线程中去完成,只要这个所有图片的 只有未成功上传的图片,该方法就在一直执行,直到到上传完成;
         * */
            @Override
            protected void onResume() {
                super.onResume();
                if (isNetworkAvailable(FieldInspecRegisterActivity.this)) {
                    if(Bimp.drr.size()>0){
                        //每次进界面时都会重新调用
                        uploadThreadTest(Bimp.drr);
                        L.e(TAG, "wode 每次必须执行的方法  且这里面现在没有要执行的方法: "+Bimp.drr.toString());
                        
                    }
                } else {
                    Toast.makeText(FieldInspecRegisterActivity.this, "请检查网络",
                            Toast.LENGTH_SHORT).show();
                }
            }
        /**
         * 上传图片的方法
         * @param mBeandrr
         */
        private void uploadThreadTest(final List<BeanPicUpload> mListBeandrr) {
            
            new Thread(new Runnable() {

                @Override
                public void run() {
                    for (int i = 0; i < mListBeandrr.size(); i++) {
                        
                        if(!Bimp.listtag.contains(mListBeandrr.get(i).uuid)){
                            
                            
                            upload(mListBeandrr.get(i));
                            
                            L.e(TAG, "Bimp.listtag集合中的元素 "+Bimp.listtag.toString());
                            L.e(TAG, "要上传的数据"+mListBeandrr.get(i));
                        }
                        
                    }
                    
                    
                }

            }).start();
        }
        private boolean isnextone =false ;
        /**
         * 在子线程中操作集合
         */
        private void upload(BeanPicUpload beanPicUpload) {
            
            //传递过来drr
            String url_ = "http://cserverupload.cserver.cn/fileupload.do";
            int res = -1;
            String BOUNDARY = UUID.randomUUID().toString(); // 边界标识 随机生成
            String PREFIX = "--";
            String LINE_END = " ";
            String CONTENT_TYPE = "multipart/form-data"; // 内容类型
            
            if (isNetworkAvailable(FieldInspecRegisterActivity.this)) {
               if(Bimp.drr.size()>0){
                 //图片上传  已上传的就不要在上传(且开始时上传的集合是空)  
                       //ture表示要上传的
                       L.e(TAG,"shenme    时候去执行了            :"+Bimp.listtag.size());

                       uploadPic(url_, BOUNDARY, PREFIX, LINE_END, CONTENT_TYPE,beanPicUpload);

               }   
            } else {
                Toast.makeText(FieldInspecRegisterActivity.this, "请检查网络", 0).show();
            }
            }
            


        private void uploadPic(String url_, String BOUNDARY, String PREFIX,
                String LINE_END, String CONTENT_TYPE,BeanPicUpload picbean) {
            
                if(!isnextone){
                    isnextone=true;    
                Log.e(TAG, "传进来的数据   开始上传的数据 "+picbean.toString());
                    if((!picbean.path.equals(""))&&picbean.path!=null){
                        
                        File perfile = new File(picbean.path);
                        
                        int res = -1;
                        // 图片上传
                        if (perfile != null) {
                            HttpURLConnection conn;
                            URL url;
                            try {
                                url = new URL(url_);
                                conn = (HttpURLConnection) url.openConnection();
                                conn.setReadTimeout(TIME_OUT);
                                conn.setConnectTimeout(TIME_OUT);
                                conn.setDoInput(true); // 允许输入流
                                conn.setDoOutput(true); // 允许输出流
                                conn.setUseCaches(false); // 不允许使用缓存
                                conn.setRequestMethod("POST"); // 请求方式
                                conn.setRequestProperty("Charset", CHARSET); // 设置编码
                                conn.setRequestProperty("connection", "keep-alive");
                                conn.setRequestProperty("Content-Type", CONTENT_TYPE+ ";boundary=" + BOUNDARY);

                                DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
                                L.e(TAG, "wode 数据输出流建立");
                                /**
                                 * 当文件不为空时执行上传
                                 * name里面的值为服务器端需要key
                                 * 只有这个key 才可以得到对应的文件filename是文件的名字,包含后缀名
                                 *
                                 */
                                StringBuffer sb = new StringBuffer();
                                sb.append(PREFIX);
                                sb.append(BOUNDARY);
                                sb.append(LINE_END);
                                
                                L.e(TAG, "wode shangchuan de wenjian 名称:"+perfile.getName());
                                
                                sb.append("Content-Disposition: form-data; name="file"; filename=""+ perfile.getName() + """ + LINE_END);
                                sb.append("Content-Type: application/octet-stream; charset="+ CHARSET + LINE_END);
                                sb.append(LINE_END);
                                dos.write(sb.toString().getBytes());
                                InputStream is = new FileInputStream(perfile);
                                long total = perfile.length();
                                byte[] bytes = new byte[1024 * 10];
                                int len = 0;
                                int count = 0;
                                int progress = 0;
                                while ((len = is.read(bytes)) != -1) {
                                    count += len;
                                    progress = ((int) ((count / (float) total) * 100));
                                    if (progress == 100) {

                                    }
                                    dos.write(bytes, 0, len);
                                }
                                is.close();
                                dos.write(LINE_END.getBytes());
                                byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes();
                                dos.write(end_data);
                                dos.flush();
                                /**
                                 * 获取响应码 200=成功 当响应成功,获取响应的流
                                 */
                                res = conn.getResponseCode();
                                if (res == 200) {
                                    InputStream input = conn.getInputStream();
                                    StringBuffer sb1 = new StringBuffer();
                                    int ss;
                                    while ((ss = input.read()) != -1) {
                                        sb1.append((char) ss);
                                    }
                                    String result = sb1.toString();
                                    JSONObject jsonObject;
                                    jsonObject = new JSONObject(result);
                                    uploadStr.append(jsonObject.optString("downloadUrl"));
                                    uploadStr.append(",");
                                    uploadNewStr.append(jsonObject.optString("newdownloadUrl"));
                                    uploadNewStr.append(",");
                                    
                                    //上传成功时进行保存
                                    Selected++;// 成功的第几张图片
                                    if (!pictureTypeMap.containsKey(picbean.uuid)) {
                                        // 为什么在这打不到phototselect的值
                                        pictureTypeMap.put(picbean.uuid, "T");// 选择的
                                        
                                        L.e(TAG, "集合中保存了数据   :"+picbean.uuid+""+"   "+"T");
                                    }
                                    // 使用bean类来记录所有的图片
                                    
                                    Bimp.listtag.add(picbean.uuid);
                                    // 这个发送消息的时候是关键
                                    handler.sendEmptyMessage(UPLOADSUCCESS);
                                    
                                    isnextone = false;
                                    Log.e(TAG, "上传成功就会发送消息 Bimp.listtag 集合"+Bimp.listtag.toString());
                                    Log.e(TAG, "上传成功就会发送消息 Bimp.drr  集合 "+Bimp.drr.toString());
                                } else if (res == 404) {
                                    Toast.makeText(FieldInspecRegisterActivity.this, "网页找不到", 0)
                                            .show();
                                } else if (res == 500) {
                                    Toast.makeText(FieldInspecRegisterActivity.this, "服务器有问题",
                                            0).show();
                                }
                            } catch (Exception e) {
                                Log.e(TAG, "异常  " + e.toString());
                                e.printStackTrace();
                            }
                        }
                    }    
                }    
            }           

  • 相关阅读:
    格式化数字,将字符串格式的数字,如:1000000 改为 1 000 000 这种展示方式
    jquery图片裁剪插件
    前端开发采坑之安卓和ios的兼容问题
    页面消息提示,上下滚动
    可以使用css的方式让input不能输入文字吗?
    智慧农村“三网合一”云平台测绘 大数据 农业 信息平台 应急
    三维虚拟城市平台测绘 大数据 规划 三维 信息平台 智慧城市
    农业大数据“一张图”平台测绘 大数据 房产 国土 农业 信息平台
    应急管理管理局安全生产预警平台应急管理系统不动产登记 测绘 大数据 规划 科教 三维 信息平台
    地下综合管廊管理平台测绘 大数据 地下管线 三维 信息平台
  • 原文地址:https://www.cnblogs.com/zyanrong/p/5486413.html
Copyright © 2011-2022 走看看