#服务端和客户端交互服务器:接收文件,并且把文件,存储到指定目录,对文件进行命名的等操作。客户端:选定文件,拼接参数,上传到指定服务器上。#购买服务器(阿里云服务器或者自己搭建服务器)#搭建服务器(软件服务器) 源码环境:jre7 tomcat71、将.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/#download2.单独请求某一张图片的用法 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
相关资源:Android 常用六大框架