#服務端和客戶端交互
服務器:接收文件,並且把文件,存儲到指定目錄,對文件進行命名的等操作。
客戶端:選定文件,拼接參數,上傳到指定服務器上。
#購買服務器(阿里雲服務器或者自己搭建服務器)
#搭建服務器(軟件服務器)
源碼環境:
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;
}
}