上传多张图片到服务器
16lz
2021-01-26
最近项目中涉及到了上传多张图片到服务器,于是写了一个简单的demo和大家分享。
源码下载地址 http://download.csdn.net/detail/lzq520210/9353663
需要注意的是,本项目是用androidstudio开发的,build.gradle文件如下:
apply plugin: 'com.android.application'android { compileSdkVersion 23 buildToolsVersion "21.1.2" defaultConfig { applicationId "com.example.imagedemo" minSdkVersion 10 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } useLibrary 'org.apache.http.legacy'}dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:21.1.2' compile 'com.android.support:design:23.1.1' compile files('libs/android-async-http-1.4.6.jar') compile 'eu.the4thfloor.volley:com.android.volley:2015.05.28'}
代码如下:
package com.example.imagedemo;import android.content.Context;import android.content.Intent;import android.database.Cursor;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.graphics.drawable.BitmapDrawable;import android.media.ExifInterface;import android.media.ThumbnailUtils;import android.net.Uri;import android.os.AsyncTask;import android.os.Build;import android.os.Bundle;import android.os.Environment;import android.preference.PreferenceActivity;import android.provider.MediaStore;import android.support.design.widget.FloatingActionButton;import android.support.design.widget.Snackbar;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.util.DisplayMetrics;import android.util.Log;import android.view.Display;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.Menu;import android.view.MenuItem;import android.view.ViewGroup;import android.view.WindowManager;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.GridView;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.PopupWindow;import android.widget.TextView;import android.widget.Toast;import com.loopj.android.http.AsyncHttpClient;import com.loopj.android.http.AsyncHttpResponseHandler;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Collections;import java.util.Date;import java.util.List;import java.util.Random;import org.apache.http.Header;public class MainActivity extends AppCompatActivity { private List<Bitmap> gridViewBitmap = new ArrayList<>(); private GridViewAdapter adapter; private static final int CAMERA_SELECT_CODE = 111;// 照相机拍摄 public static final String CAMERA_DIR_PATH = Environment.getExternalStorageDirectory().getAbsolutePath();// 拍照照片保存的目录 public static File mCurrentFilePath = new File(CAMERA_DIR_PATH + createFileName());// 当前图片写入的文件路径 private int _scaleWidth = 420; private int _scaleHeight = 550; private GridView mGridview; private boolean isShowDelete = false; private BitmapFactory.Options opts; private PopupWindow popWindow; private LayoutInflater layoutInflater; LinearLayout cancel; private TextView photograph,albums; private ArrayList<String> list=new ArrayList<>(); private Button upload; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mGridview = (GridView) findViewById(R.id.gridview); upload = ((Button) findViewById(R.id.upload)); upload.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { try { postFile(list); } catch (Exception e) { e.printStackTrace(); } } }); gridViewBitmap.add(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_add_image));//带减号 添加此行代码// gridViewBitmap.add(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_add_image)); adapter = new GridViewAdapter(); mGridview.setAdapter(adapter); } class GridViewAdapter extends BaseAdapter { @Override public int getCount() { return gridViewBitmap.size(); } @Override public Object getItem(int position) { return gridViewBitmap.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, final ViewGroup parent) { ViewHolder holder = new ViewHolder(); if (convertView == null) { convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.gridviewitem, null); holder.itemImage = (ImageView) convertView.findViewById(R.id.gridview_image); holder.itemImageDelete = (ImageView) convertView.findViewById(R.id.gridview_dele); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } Log.i("TAG",gridViewBitmap.get(position)+""); if (gridViewBitmap!=null){ holder.itemImage.setImageBitmap(gridViewBitmap.get(position)); }// if (isShowDelete) {// holder.itemImageDelete.setVisibility(View.VISIBLE);// } else {// holder.itemImageDelete.setVisibility(View.GONE);// } holder.itemImageDelete.setVisibility(View.VISIBLE); if (position == gridViewBitmap.size() - 1) { holder.itemImageDelete.setVisibility(View.GONE); holder.itemImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showpwdwindow();// showPopupWindow(parent); } }); } //点击减号时 是、所有图片上方显示小减号// else if (position == gridViewBitmap.size() - 2) {// holder.itemImageDelete.setVisibility(View.GONE);// holder.itemImage.setOnClickListener(new View.OnClickListener() {// @Override// public void onClick(View v) {//// showpwdwindow();// Toast.makeText(MainActivity.this, "减号被点击", Toast.LENGTH_SHORT).show();// if (isShowDelete) {// isShowDelete = false;// } else {// isShowDelete = true;// }// notifyDataSetChanged();// }// });// } else { holder.itemImage.setOnClickListener(null); } holder.itemImageDelete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { gridViewBitmap.remove(position); list.remove(position); adapter.notifyDataSetChanged(); Log.i("----list.size()----",list.size()+""); } }); return convertView; } class ViewHolder { private ImageView itemImage; private ImageView itemImageDelete; } } private void showpwdwindow() { // popwindows加载布局 layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); View localView = LayoutInflater.from(MainActivity.this).inflate(R.layout.pop_choose_pic, null); final PopupWindow localPopupWindow = new PopupWindow(localView, -1, -1, true); localPopupWindow.setBackgroundDrawable(new BitmapDrawable()); localPopupWindow.setOutsideTouchable(true); localPopupWindow.showAtLocation(mGridview, 119, 0, 0); ((TextView) localView.findViewById(R.id.gallery)).setOnClickListener(new View.OnClickListener() { public void onClick(View paramAnonymousView) { // this.getCamera(localPopupWindow); showCamera(); localPopupWindow.dismiss(); } }); ((TextView) localView.findViewById(R.id.photo)).setOnClickListener(new View.OnClickListener() { public void onClick(View paramAnonymousView) { showAlbums(); localPopupWindow.dismiss(); } }); ((TextView) localView.findViewById(R.id.cancel)).setOnClickListener(new View.OnClickListener() { public void onClick(View paramAnonymousView) { localPopupWindow.dismiss(); } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) {// 相册 if (requestCode == CAMERA_SELECT_CODE) {// 照相机 Bitmap image = createThumb(mCurrentFilePath.getAbsolutePath()); Log.i("-----照相机url", mCurrentFilePath.getAbsolutePath()); Collections.reverse(gridViewBitmap); gridViewBitmap.add(image); list.add(mCurrentFilePath.getAbsolutePath()); Collections.reverse(gridViewBitmap); adapter.notifyDataSetChanged(); } else if (requestCode == 3000) { Uri uri = data.getData(); String path = getPath(uri); Log.i("-----拍照url",path); list.add(path); Bitmap image = createThumb(path); //Bitmap bitmap = BitmapFactory.decodeFile(path); Collections.reverse(gridViewBitmap); gridViewBitmap.add(image); Collections.reverse(gridViewBitmap); adapter.notifyDataSetChanged(); } } } //上传头像 public void postFile(ArrayList<String> list) throws Exception{// File file = new File(path); if (list!=null&&list.size()>0){ com.loopj.android.http.RequestParams params=new com.loopj.android.http.RequestParams(); AsyncHttpClient client= new AsyncHttpClient(); client.addHeader("ticket", "08DDB06A0457505B0BE6013C6D353197"); client.addHeader("ContentType", "multipart/form-data") ; for (int i=0;i<list.size();i++){ File file=new File(list.get(i)); params.put("file"+i, file); } Log.i("-----list.size()------",list.size()+""); params.put("type", "MALL"); params.put("where", "FOCUS"); client.post("http://hgj.doolii.cn/merchant/res/image/upload", params, new AsyncHttpResponseHandler(){ @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { if (statusCode==200) { Toast.makeText(MainActivity.this, "成功", Toast.LENGTH_LONG).show(); Log.i("---AsyncHttpClient---",new String(responseBody));// ACache aCache=ACache.get(UserActivity.this);//清除缓存// aCache.remove("accountInfo");// app.getAccount().setImgUrl(path);// my_headPicture.setImageBitmap(BitmapUtils.UrlToBitmap(path)); } } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { Toast.makeText(MainActivity.this, "上传失败", Toast.LENGTH_LONG).show(); } }); }else { Toast.makeText(MainActivity.this, "没有选择图片,不可上传", Toast.LENGTH_LONG).show(); } } /** * 获取文件绝对路径 * * @param uri * @return */ public String getPath(Uri uri) { if ("content".equalsIgnoreCase(uri.getScheme())) { Cursor cursor = null; try { cursor = this.getContentResolver().query(uri, null, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); if (cursor.moveToFirst()) { return cursor.getString(column_index); } } catch (Exception e) { cursor.close(); } cursor.close(); } else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } public Bitmap createThumb(String path) { Bitmap bitmap = BitmapFactory.decodeFile(path); //利用Bitmap位图对象生成缩略图 int height = (int) (getScreenDensity(this) * 60); int width = (int) (getScreenDensity(this) * 100); bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height); return bitmap; } /** * 获取屏幕密度 * * @param context * @return */ public static float getScreenDensity(Context context) { return getMetricsFacade(context).density; } /** * 获取屏幕对象 * * @param context * @return */ private static DisplayMetrics getMetricsFacade(Context context) { WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = manager.getDefaultDisplay(); DisplayMetrics dm = new DisplayMetrics(); display.getMetrics(dm); return dm; } /** * 显示默认的图片选择器 */ public void showAlbums() { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); startActivityForResult(intent, 3000); } /** * 调用系统自带的相机 并且保存到固定的文件里 */ public void showCamera() { Intent takephoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); takephoto.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mCurrentFilePath)); startActivityForResult(takephoto, CAMERA_SELECT_CODE); } // 设置上传头像 private void showPopupWindow(View parent) { if (popWindow == null) { View view = layoutInflater.inflate(R.layout.pop_select_photo, null);// 相机/相册/取消选择界面 popWindow = new PopupWindow(view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, true); initPop(view);// 初始化popwindow参数 } popWindow.setAnimationStyle(android.R.style.Animation_InputMethod); popWindow.setFocusable(true); popWindow.setOutsideTouchable(true); popWindow.setBackgroundDrawable(new BitmapDrawable()); popWindow .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); popWindow.showAtLocation(parent, Gravity.CENTER, 0, 0); } // 初始化popwindow参数 public void initPop(View view) { photograph = (TextView) view.findViewById(R.id.photograph);// 拍照 albums = (TextView) view.findViewById(R.id.albums);// 相册 cancel = (LinearLayout) view.findViewById(R.id.cancel);// 取消 // 相机拍照监听 photograph.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { showAlbums(); } }); // 相册获取监听 albums.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { popWindow.dismiss(); showCamera(); } }); // 取消监听 cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { popWindow.dismiss(); } }); } //为图片创建不同的名字 public static String createFileName() { String fileName = ""; //系统当前时间 Date date = new Date(System.currentTimeMillis()); SimpleDateFormat dateFormat = new SimpleDateFormat("'IMG'_yyyyMMdd_HHmmss"); fileName = dateFormat.format(date) + ".jpg"; return fileName; }}layout文件如下:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context=".MainActivity" tools:showIn="@layout/activity_main"><Button android:id="@+id/upload" android:layout_width="match_parent" android:layout_height="wrap_content" /> <GridView android:id="@+id/gridview" android:layout_width="match_parent" android:layout_height="match_parent" android:numColumns="4" android:scrollbars="none" /></LinearLayout>pop_choose_pic布局文件如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout android:background="@color/popcolor" android:layout_width="fill_parent" android:orientation="vertical" android:layout_height="fill_parent" android:gravity="center" xmlns:android="http://schemas.android.com/apk/res/android"> <TextView android:textSize="16sp" android:textColor="#fff" android:gravity="center" android:id="@+id/photo" android:background="@drawable/btn_press" android:padding="10dp" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:text="photo" android:layout_centerInParent="true" /> <TextView android:textSize="16sp" android:textColor="#fff" android:gravity="center" android:id="@+id/gallery" android:background="@drawable/btn_press" android:padding="10dp" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginTop="30dp" android:layout_marginRight="20dp" android:text="gallery" /> <TextView android:textSize="16sp" android:textColor="#fff" android:gravity="center" android:id="@+id/cancel" android:background="@drawable/btn_press" android:padding="10dp" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginTop="30dp" android:layout_marginRight="20dp" android:text="cancle" /></LinearLayout>gridviewitem代码如下:<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/gridview_image" android:layout_width="100dp" android:layout_height="100dp" /> <ImageView android:id="@+id/gridview_dele" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@id/gridview_image" android:layout_alignTop="@id/gridview_image" android:padding="10dp" android:src="@mipmap/dele" android:visibility="gone" /></RelativeLayout>
更多相关文章
- Cordova 3.x 基础(13) -- 为Android(安卓)APK签名
- 基于Android(安卓)Studio 的NDK之 “Hello,World!”
- Android学习笔记(三) 之模拟打电话
- Android(安卓)HIDL 中 hidl-gen使用
- android实现瀑布流加载图片
- ECLIPSE android 布局页面文件出错故障排除Exception raised dur
- Android(安卓)Studio上报错java.net.UnknownServiceException: C
- Android图片加载之认识bitmap的四种加载方式
- Error generating final archive: java.io.EOFException