常用的有关文件上传下载的框架和图片加载框架


#服务端和客户端交互
服务器:接收文件,并且把文件,存储到指定目录,对文件进行命名的等操作。

客户端:选定文件,拼接参数,上传到指定服务器上。


#购买服务器(阿里云服务器或者自己搭建服务器)


#搭建服务器(软件服务器)

 源码环境:
jre7 tomcat7

1、将.war文件复制到tomcat服务器webapps下,启动服务器即可

2、访问工程路径a即可测试上传

b/s架构  通过浏览器上传

c/s结构  通过Android端上传


上传文件服务地址:
http://192.168.10.168:8080/FileUpload/FileUploadServlet


#利用xUtils3上传多个文件,代码如下

 // 上传多文件示例
    @Event(value = R.id.btn_test2)
    private void onTest2Click(View view) throws FileNotFoundException {


        RequestParams params = new RequestParams("http://192.168.10.168:8080/FileUpload/FileUploadServlet");


        // 加到url里的参数, http://xxxx/s?wd=xUtils
        params.addQueryStringParameter("wd", "xUtils");//name=yangguangfu?password=1233445

        // 添加到请求body体的参数, 只有POST, PUT, PATCH, DELETE请求支持.
        // params.addBodyParameter("wd", "xUtils");

        // 使用multipart表单上传文件
        params.setMultipart(true);//设置支持多个文件上传


        //具体的某一个文件
        params.addBodyParameter(
                "file1",
                new File("/mnt/sdcard/1.jpg"),
                null); // 如果文件没有扩展名, 最好设置contentType参数.

     //具体的某一个文件
        params.addBodyParameter(
                "file2",
                new File("/mnt/sdcard/2.jpg"),
                null); // 如果文件没有扩展名, 最好设置contentType参数.




        x.http().post(params, new Callback.CommonCallback<String>() {
            @Override
            public void onSuccess(String result) {
                Toast.makeText(x.app(), result + "上传成功", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                Toast.makeText(x.app(), ex.getMessage() + "上传失败", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onCancelled(CancelledException cex) {
                Toast.makeText(x.app(), "cancelled", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onFinished() {
                Toast.makeText(x.app(), "onFinished", Toast.LENGTH_LONG).show();
            }
        });
    }


#利用使用xUtils下载文件列表

下载地址:
http://192.168.10.168:8080/oppo.mp4

 // 添加到下载列表
    @Event(value = R.id.btn_test3)
    private void onTest3Click(View view) throws DbException {
        for (int i = 0; i < 5; i++) {
            String url = et_url.getText().toString();//得到下载的地址
            String label = i + "xUtils_" + System.nanoTime();//下载的到本地的命名
            DownloadService.getDownloadManager().startDownload(
                    url, label,
                    "/sdcard/xUtils/" + label + ".mp4", true, false, null);
        }
    }


#利用使用xUtils下载单个文件


        String url = "http://192.168.10.168:8080/oppo.mp4";
        String label = "oppo_" + "afua" + System.nanoTime();

        DownloadService.getDownloadManager().startDownload(
                url, label,
                "/sdcard/xUtils/" + label + ".mp4", true, false, null);

#打开下载列表
   @Event(value = R.id.btn_test4)
    private void onTest4Click(View view) throws DbException {
        getActivity().startActivity(new Intent(getActivity(), DownloadActivity.class));
    }


#AFinla的使用

1.添加权限
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2.把jar包拷贝到项目的lib目录下

3.普通文本的请求,代码如下:

     public void getDete(View view){
            FinalHttp fh = new FinalHttp();
            fh.get("https://github.com/yangfuhai/afinal", new AjaxCallBack(){
    
                @Override
                public void onLoading(long count, long current) { //每1秒钟自动被回调一次
                    textView.setText(current+"/"+count);
                }
    
                @Override
                public void onSuccess(Object o) {
                    super.onSuccess(o);
                    textView.setText(o.toString());
                }
    
                @Override
                public void onStart() {
                    //开始http请求的时候回调
                }
    
            });
        }


4.Afinal文件的下载

      public void downloadFile(View view){
            FinalHttp fh = new FinalHttp();
            fh.download("http://192.168.10.168:8080/oppo.mp4", "/mnt/sdcard/afinloop.mp4", new AjaxCallBack<File>() {
                @Override
                public void onSuccess(File file) {
                    super.onSuccess(file);
                    Toast.makeText(MainActivity.this,"下载成功",Toast.LENGTH_SHORT).show();
                }
    
                @Override
                public AjaxCallBack<File> progress(boolean progress, int rate) {
                    return super.progress(progress, rate);
                }
    
                @Override
                public void onStart() {
                    super.onStart();
                    Toast.makeText(MainActivity.this,"onStart",Toast.LENGTH_SHORT).show();
                }
    
                @Override
                public void onLoading(long count, long current) {
                    super.onLoading(count, current);
                }
    
                @Override
                public boolean isProgress() {
                    return super.isProgress();
                }
    
                @Override
                public int getRate() {
                    return super.getRate();
                }
            });
    
    //
        }
下载地址:http://download.csdn.net/detail/sinat_32804317/9551489

#okhttp的使用 有三种使用方式
第一种使用方式.关联库文件
第二种使用方式.把jar拷贝到工程lib目录下关联jar
第三种使用方式.在联网情况下
compile 'com.squareup.okhttp:okhttp:2.4.0'
gradle: compile 'com.squareup.okio:okio:1.5.0'


#okhttp的使用 请求普通的文本

   /**
 * get请求
     * 请求文本信息
 * @param view
 */
    public void getHtml(View view)
    {
        String url = "http://192.168.10.168:8080/zhbj/categories.json";
        OkHttpUtils
                .get()
                .url(url)
                .build()
                .execute(new MyStringCallback());
    }


  public class MyStringCallback extends StringCallback
    {
        @Override
        public void onBefore(Request request)
        {
            super.onBefore(request);
            setTitle("loading...");
        }

        @Override
        public void onAfter()
        {
            super.onAfter();
            setTitle("Sample-okHttp");
        }

        @Override
        public void onError(Request request, Exception e)
        {
            mTv.setText("onError:" + e.getMessage());
        }

        @Override
        public void onResponse(String response)
        {
            mTv.setText("onResponse" + response);
        }

        @Override
        public void inProgress(float progress)
        {
            Log.e(TAG, "inProgress:" + progress);
            mProgressBar.setProgress((int) (100 * progress));
        }
    }


#okhttp的使用-大文件的下载


    /**
     * 下载文件
     * @param view
     */
    public void downloadFile(View view)
    {
        String url = "http://192.168.10.168:8080/oppo.mp4";
        OkHttpUtils//
                .get()//
                .url(url)//
                .build()//
                .execute(new FileCallBack(Environment.getExternalStorageDirectory().getAbsolutePath(), "okhttpoppo.mp4")//
                {

                    @Override
                    public void onBefore(Request request)
                    {
                        super.onBefore(request);
                    }

                    @Override
                    public void inProgress(float progress)
                    {
                        mProgressBar.setProgress((int) (100 * progress));
                    }

                    @Override
                    public void onError(Request request, Exception e)
                    {
                        Log.e(TAG, "onError :" + e.getMessage());
                    }

                    @Override
                    public void onResponse(File file)
                    {
                        Log.e(TAG, "onResponse :" + file.getAbsolutePath());
                    }
                });
    }



#okhttp的使用-单个文件的上传


    /**
         * 上传文件
         * @param view
         */
        public void uploadFile(View view)
        {
    
            File file = new File(Environment.getExternalStorageDirectory(), "1.jpg");
            if (!file.exists())
            {
                Toast.makeText(MainActivity.this, "文件不存在,请修改文件路径", Toast.LENGTH_SHORT).show();
                return;
            }
            Map<String, String> params = new HashMap<>();
    //        params.put("username", "杨光福");
    //        params.put("password", "123");
            Map<String, String> headers = new HashMap<>();
            headers.put("APP-Key", "APP-Secret222");
            headers.put("APP-Secret", "APP-Secret111");
    
            String url = "http://192.168.10.168:8080/FileUpload/FileUploadServlet";
    
            OkHttpUtils.post()//
                    .addFile("mFile", "agguigu-afu.jpe", file)//
                    .url(url)//
                    .params(params)//
                    .headers(headers)//
                    .build()//
                    .execute(new MyStringCallback());
        }
    


#okhttp的使用-多个文件的上传


         /**
         * 多文件同时上传
         * @param view
         */
        public void multiFileUpload(View view)
        {
            File file = new File(Environment.getExternalStorageDirectory(), "1.jpg");
            File file2 = new File(Environment.getExternalStorageDirectory(), "2.txt");
            if (!file.exists()||!file2.exists())
            {
                Toast.makeText(MainActivity.this, "文件不存在,请修改文件路径", Toast.LENGTH_SHORT).show();
                return;
            }
            Map<String, String> params = new HashMap<>();
    //        params.put("username", "杨光福");
    //        params.put("password", "123");
    
            String url = "http://192.168.10.168:8080/FileUpload/FileUploadServlet";
            OkHttpUtils.post()//
                    .addFile("mFile", "01.jpg", file)//
                    .addFile("mFile", "afua.txt", file2)//
                    .url(url)
                    .params(params)//
                    .build()//
                    .execute(new MyStringCallback());
        }


#okhttp的使用-请求网络图片

        /**
             * 请求网络到图片
             * @param view
             */
            public void getImage(View view)
            {
                mTv.setText("");
                String url = "http://images.csdn.net/20150817/1.jpg";
                OkHttpUtils
                        .get()//
                        .url(url)//
                        .tag(this)//
                        .build()//
                        .connTimeOut(5000)
                        .readTimeOut(5000)
                        .writeTimeOut(5000)
                        .execute(new BitmapCallback() {
                            @Override
                            public void onError(Request request, Exception e) {
                                mTv.setText("onError:" + e.getMessage());
                            }
        
                            @Override
                            public void onResponse(Bitmap bitmap) {
                                //设置图片
                                mImageView.setImageBitmap(bitmap);
                            }
                        });
            }
   okhttpjar包下载地址:    
        

    


#Android-Universal-Image-Loader在ListView中使用

在使用Image-Loader之前需要在Application里面做初始化


public static void initImageLoader(Context context) {
        // This configuration tuning is custom. You can tune every option, you may tune some of them,
        // or you can create default configuration by
        //  ImageLoaderConfiguration.createDefault(this);
        // method.
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
                //设置当前线程的优先级
                .threadPriority(Thread.NORM_PRIORITY - 2)
                // 缓存显示不同大小的同一张图片
                .denyCacheImageMultipleSizesInMemory()
                //将保存的时候的URI名称用MD5 加密
                .discCacheFileNameGenerator(new Md5FileNameGenerator())
                .tasksProcessingOrder(QueueProcessingType.LIFO)
                .writeDebugLogs() // Remove for release app
                .build();
        // Initialize ImageLoader with configuration.
        ImageLoader.getInstance().init(config);
    }



1.在适配器中配置信息

 protected ImageLoader imageLoader = ImageLoader.getInstance();

 DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.ic_stub)
                .showImageForEmptyUri(R.drawable.ic_empty)
                .showImageOnFail(R.drawable.ic_error)
                .cacheInMemory(true)////设置下载的图片是否缓存在内存中
                .cacheOnDisc(true)////设置下载的图片是否缓存在SD卡中
                .considerExifParams(true)//是否考虑JPEG图像EXIF参数(旋转,翻转)
                .displayer(new RoundedBitmapDisplayer(20))//设置图片圆角
                .build();


2.在适配器中的getView中请求图片如下代码:


  @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
           ......

            //第一个参数是:图片的地址,第二个参数是要绑定的图片,第三个参数处理图片的配置,第四个参数
            imageLoader.displayImage(imageUrls[position], holder.image, options, animateFirstListener);

            return view;
        }
    }


3.设置监听animateFirstListener代码如下

     class ItemAdapter extends BaseAdapter {

        private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();

        ..............

  }


    private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {

        static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());

        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
            if (loadedImage != null) {
                ImageView imageView = (ImageView) view;
                boolean firstDisplay = !displayedImages.contains(imageUri);
                if (firstDisplay) {
                    FadeInBitmapDisplayer.animate(imageView, 500);//显示图片的过程有一个渐变动画
                    displayedImages.add(imageUri);
                }
            }
        }
    }



#Android-Universal-Image-Loader在 GridView中使用

1.设置配置信息

   protected ImageLoader imageLoader = ImageLoader.getInstance();

    DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.ic_stub)
                .showImageForEmptyUri(R.drawable.ic_empty)
                .showImageOnFail(R.drawable.ic_error)
                .cacheInMemory(true)
                .cacheOnDisc(true)
                .considerExifParams(true)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .build();

2.在适配器的getView中请求网络图片,请求图片的时候,带有加载进度,代码如下,


  @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;
            View view = convertView;
            if (view == null) {
                view = getLayoutInflater().inflate(R.layout.item_grid_image, parent, false);
                holder = new ViewHolder();
                assert view != null;
                holder.imageView = (ImageView) view.findViewById(R.id.image);
                holder.progressBar = (ProgressBar) view.findViewById(R.id.progress);
                view.setTag(holder);
            } else {
                holder = (ViewHolder) view.getTag();
            }

            imageLoader.displayImage(imageUrls[position], holder.imageView, options, new SimpleImageLoadingListener() {
                                         @Override
                                         public void onLoadingStarted(String imageUri, View view) {
                                             holder.progressBar.setProgress(0);
                                             holder.progressBar.setVisibility(View.VISIBLE);
                                         }

                                         @Override
                                         public void onLoadingFailed(String imageUri, View view,
                                                 FailReason failReason) {
                                             holder.progressBar.setVisibility(View.GONE);
                                         }

                                         @Override
                                         public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                                             holder.progressBar.setVisibility(View.GONE);
            }
                                     }, new ImageLoadingProgressListener() {
                                         @Override
                                         public void onProgressUpdate(String imageUri, View view, int current,
                                                 int total) {
                                             holder.progressBar.setProgress(Math.round(100.0f * current / total));
                                         }
                                     }
            );

            return view;
        }



image_loaderjar包下载地址:http://download.csdn.net/detail/sinat_32804317/9552591
    
    
    


#Picasso 的加载图片库的使用

1.把jar拷贝到项目下lib里

 下载jar包地址
http://square.github.io/picasso/#download

2.单独请求某一张图片的用法
 Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

3.在ListView中适配器的getView中用法
 
  @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder;
        if (convertView == null) {
            convertView = View.inflate(context, R.layout.image_items, null);
            viewHolder = new ViewHolder();
            viewHolder.imageview = (ImageView) convertView.findViewById(R.id.imageview);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.imageview.setImageResource(R.drawable.empty_photo);
        //得到数据
        String imageurl = imageThumbUrls[position];
//       
        Picasso.with(context).load(imageurl).into(viewHolder.imageview);

        return convertView;

    }


#Glide 的加载图片库的使用

1.需要在联网的情况下,在build.gradle文件中配置

      compile 'com.github.bumptech.glide:glide:3.7.0'
      compile 'com.android.support:support-v4:22.2.1'

2.请求单张图片代码如下:

 Glide.with(context)
    .load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
    .into(ivImg);
 
3.在使用Lisview的适配器中,getView里使用,代码如下:

  @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder;
        if (convertView == null) {
            convertView = View.inflate(context, R.layout.image_items, null);
            viewHolder = new ViewHolder();
            viewHolder.imageview = (ImageView) convertView.findViewById(R.id.imageview);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.imageview.setImageResource(R.drawable.empty_photo);
        //得到数据
        String imageurl = imageThumbUrls[position];
 
        Glide
                .with(context)
                .load(imageurl)
                .centerCrop()
                .placeholder(R.drawable.empty_photo)
                .crossFade()
                .into(viewHolder.imageview);


        return convertView;

    }



#Android-gif-drawable的使用

1.联网框架和 添加Android-gif-drawable 的jar包
  compile files('libs/android-async-http-1.4.5.jar')
  compile files('libs/classes.jar')


2.加载单张gif动画图片

  asyncHttpClient = new AsyncHttpClient();
        asyncHttpClient
                .get("http://cdn.duitang.com/uploads/item/201311/20/20131120213622_mJCUy.thumb.600_0.gif",
                        new AsyncHttpResponseHandler() {

                            @Override
                            public void onSuccess(int arg0, Header[] arg1,
                                                  byte[] arg2) {
                                // TODO Auto-generated method stub

                                GifDrawable drawable = null;
                                try {
                                    drawable = new GifDrawable(arg2);
                                } catch (IOException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                                network_gifimageview
                                        .setBackground(drawable);

                                dialog.dismiss();

                            }

                            @Override
                            public void onFailure(int arg0, Header[] arg1,
                                                  byte[] arg2, Throwable arg3) {
                                // TODO Auto-generated method stub
                                Toast.makeText(getApplicationContext(),
                                        "加载网络图片出错", Toast.LENGTH_SHORT).show();
                                dialog.dismiss();

                            }
                        });




3.用Android-gif-drawabl在ListView 中加载gif动画

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final GifImageView imageView;
        if (convertView == null) {
            imageView = new GifImageView(context);
            imageView.setScaleType(ImageView.ScaleType.FIT_XY);
            imageView.setPadding(10, 10, 10, 10);
            int size = AbsListView.LayoutParams.WRAP_CONTENT;
            AbsListView.LayoutParams layoutParams = new GridView.LayoutParams(size, size);
            imageView.setLayoutParams(layoutParams);
        } else {
            imageView = (GifImageView) convertView;
        }


        asyncHttpClient
                .get(imageUrls.get(position),
                        new AsyncHttpResponseHandler() {
                            @Override
                            public void onSuccess(int i, Header[] headers, byte[] bytes) {


                                try {

                                    GifDrawable drawable = new GifDrawable(bytes);
                                        imageView
                                                .setBackground(drawable);
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                    }


                            }


                            @Override
                            public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {
                                System.out.println(throwable.getMessage());
                            }
                        });

        return imageView;
    }




#PhotoView的使用-单张图片
作用,加载图片的时候,可以缩放图片

1.关联photoView的库

    compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'
    compile project(':PhotoView_library')

2.在布局中定义PhotoView

   <uk.co.senab.photoview.PhotoView
            android:id="@+id/iv_photo"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />



3.实例化控件并且设置相关的监听

       ImageView mImageView = (ImageView) findViewById(R.id.iv_photo);
        mCurrMatrixTv = (TextView) findViewById(R.id.tv_current_matrix);

        Drawable bitmap = getResources().getDrawable(R.drawable.wallpaper);
        mImageView.setImageDrawable(bitmap);

        // The MAGIC happens here!
        mAttacher = new PhotoViewAttacher(mImageView);

        // Lets attach some listeners, not required though!
        mAttacher.setOnMatrixChangeListener(new MatrixChangeListener());
        mAttacher.setOnPhotoTapListener(new PhotoTapListener());



   private class MatrixChangeListener implements OnMatrixChangedListener {

        @Override
        public void onMatrixChanged(RectF rect) {
            mCurrMatrixTv.setText(rect.toString());
        }
    }


  private class PhotoTapListener implements OnPhotoTapListener {

        @Override
        public void onPhotoTap(View view, float x, float y) {
            float xPercentage = x * 100f;
            float yPercentage = y * 100f;

            showToast(String.format(PHOTO_TAP_TOAST_STRING, xPercentage, yPercentage, view == null ? 0 : view.getId()));
        }
    }


#PhotoView的使用-ViewPager中使用
应用场景:类似于空间图片浏览效果

1.在布局文件中定义HackyViewPager类,它继承ViewPager的

<uk.co.senab.photoview.sample.HackyViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/view_pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />


2.设置适配器
 mViewPager.setAdapter(new SamplePagerAdapter());


3.适配器具体代码如下:

    static class SamplePagerAdapter extends PagerAdapter {

        private static final int[] sDrawables = { R.drawable.wallpaper, R.drawable.wallpaper, R.drawable.wallpaper,
                R.drawable.wallpaper, R.drawable.wallpaper, R.drawable.wallpaper };

        @Override
        public int getCount() {
            return sDrawables.length;
        }

        @Override
        public View instantiateItem(ViewGroup container, int position) {
            PhotoView photoView = new PhotoView(container.getContext());
            photoView.setImageResource(sDrawables[position]);

            // Now just add PhotoView to ViewPager and return it
            container.addView(photoView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

            return photoView;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

    }

原文地址:https://www.cnblogs.com/wangying222/p/5591258.html