android选择图片或拍照图片上传到服务器(包括上传参数)

简介:

http://blog.csdn.net/vipa1888/article/details/8213898

最近要搞一个项目,需要上传相册和拍照的图片,不负所望,终于完成了!  不过需要说明一下,其实网上很多教程拍照的图片,都是缩略图不是很清晰,所以需要在调用照相机的时候,事先生成一个地址,用于标识拍照的图片URI

具体上传代码:

1.选择图片和上传界面,包括上传完成和异常的回调监听

[java]  view plain copy
  1. package com.spring.sky.image.upload;  
  2.   
  3.   
  4. import java.util.HashMap;  
  5. import java.util.Map;  
  6.   
  7. import android.app.Activity;  
  8. import android.app.ProgressDialog;  
  9. import android.content.Intent;  
  10. import android.graphics.Bitmap;  
  11. import android.graphics.BitmapFactory;  
  12. import android.os.Bundle;  
  13. import android.os.Handler;  
  14. import android.os.Message;  
  15. import android.util.Log;  
  16. import android.view.View;  
  17. import android.view.View.OnClickListener;  
  18. import android.widget.Button;  
  19. import android.widget.ImageView;  
  20. import android.widget.ProgressBar;  
  21. import android.widget.TextView;  
  22. import android.widget.Toast;  
  23.   
  24. import com.spring.sky.image.upload.network.UploadUtil;  
  25. import com.spring.sky.image.upload.network.UploadUtil.OnUploadProcessListener;  
  26. /** 
  27.  * @author spring sky<br> 
  28.  * Email :vipa1888@163.com<br> 
  29.  * QQ: 840950105<br> 
  30.  * 说明:主要用于选择文件和上传文件操作 
  31.  */  
  32. public class MainActivity extends Activity implements OnClickListener,OnUploadProcessListener{  
  33.     private static final String TAG = "uploadImage";  
  34.       
  35.     /** 
  36.      * 去上传文件 
  37.      */  
  38.     protected static final int TO_UPLOAD_FILE = 1;    
  39.     /** 
  40.      * 上传文件响应 
  41.      */  
  42.     protected static final int UPLOAD_FILE_DONE = 2;  //  
  43.     /** 
  44.      * 选择文件 
  45.      */  
  46.     public static final int TO_SELECT_PHOTO = 3;  
  47.     /** 
  48.      * 上传初始化 
  49.      */  
  50.     private static final int UPLOAD_INIT_PROCESS = 4;  
  51.     /** 
  52.      * 上传中 
  53.      */  
  54.     private static final int UPLOAD_IN_PROCESS = 5;  
  55.     /*** 
  56.      * 这里的这个URL是我服务器的javaEE环境URL 
  57.      */  
  58.     private static String requestURL = "http://192.168.10.160:8080/fileUpload/p/file!upload";  
  59.     private Button selectButton,uploadButton;  
  60.     private ImageView imageView;  
  61.     private TextView uploadImageResult;  
  62.     private ProgressBar progressBar;  
  63.       
  64.     private String picPath = null;  
  65.     private ProgressDialog progressDialog;  
  66.       
  67.     /** Called when the activity is first created. */  
  68.     @Override  
  69.     public void onCreate(Bundle savedInstanceState) {  
  70.         super.onCreate(savedInstanceState);  
  71.         setContentView(R.layout.main);  
  72.         initView();  
  73.     }  
  74.       
  75.     /** 
  76.      * 初始化数据 
  77.      */  
  78.     private void initView() {  
  79.         selectButton = (Button) this.findViewById(R.id.selectImage);  
  80.         uploadButton = (Button) this.findViewById(R.id.uploadImage);  
  81.         selectButton.setOnClickListener(this);  
  82.         uploadButton.setOnClickListener(this);  
  83.         imageView = (ImageView) this.findViewById(R.id.imageView);  
  84.         uploadImageResult = (TextView) findViewById(R.id.uploadImageResult);  
  85.         progressDialog = new ProgressDialog(this);  
  86.         progressBar = (ProgressBar) findViewById(R.id.progressBar1);  
  87.     }  
  88.   
  89.     @Override  
  90.     public void onClick(View v) {  
  91.         switch (v.getId()) {  
  92.         case R.id.selectImage:  
  93.             Intent intent = new Intent(this,SelectPicActivity.class);  
  94.             startActivityForResult(intent, TO_SELECT_PHOTO);  
  95.             break;  
  96.         case R.id.uploadImage:  
  97.             if(picPath!=null)  
  98.             {  
  99.                 handler.sendEmptyMessage(TO_UPLOAD_FILE);  
  100.             }else{  
  101.                 Toast.makeText(this"上传的文件路径出错", Toast.LENGTH_LONG).show();  
  102.             }  
  103.             break;  
  104.         default:  
  105.             break;  
  106.         }  
  107.     }  
  108.   
  109.     @Override  
  110.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  111.         if(resultCode==Activity.RESULT_OK && requestCode == TO_SELECT_PHOTO)  
  112.         {  
  113.             picPath = data.getStringExtra(SelectPicActivity.KEY_PHOTO_PATH);  
  114.             Log.i(TAG, "最终选择的图片="+picPath);  
  115.             Bitmap bm = BitmapFactory.decodeFile(picPath);  
  116.             imageView.setImageBitmap(bm);  
  117.         }  
  118.         super.onActivityResult(requestCode, resultCode, data);  
  119.     }  
  120.       
  121.   
  122.     /** 
  123.      * 上传服务器响应回调 
  124.      */  
  125.     @Override  
  126.     public void onUploadDone(int responseCode, String message) {  
  127.         progressDialog.dismiss();  
  128.         Message msg = Message.obtain();  
  129.         msg.what = UPLOAD_FILE_DONE;  
  130.         msg.arg1 = responseCode;  
  131.         msg.obj = message;  
  132.         handler.sendMessage(msg);  
  133.     }  
  134.       
  135.     private void toUploadFile()  
  136.     {  
  137.         uploadImageResult.setText("正在上传中...");  
  138.         progressDialog.setMessage("正在上传文件...");  
  139.         progressDialog.show();  
  140.         String fileKey = "pic";  
  141.         UploadUtil uploadUtil = UploadUtil.getInstance();;  
  142.         uploadUtil.setOnUploadProcessListener(this);  //设置监听器监听上传状态  
  143.           
  144.         Map<String, String> params = new HashMap<String, String>();  
  145.         params.put("orderId""11111");  
  146.         uploadUtil.uploadFile( picPath,fileKey, requestURL,params);  
  147.     }  
  148.       
  149.     private Handler handler = new Handler(){  
  150.         @Override  
  151.         public void handleMessage(Message msg) {  
  152.             switch (msg.what) {  
  153.             case TO_UPLOAD_FILE:  
  154.                 toUploadFile();  
  155.                 break;  
  156.               
  157.             case UPLOAD_INIT_PROCESS:  
  158.                 progressBar.setMax(msg.arg1);  
  159.                 break;  
  160.             case UPLOAD_IN_PROCESS:  
  161.                 progressBar.setProgress(msg.arg1);  
  162.                 break;  
  163.             case UPLOAD_FILE_DONE:  
  164.                 String result = "响应码:"+msg.arg1+"\n响应信息:"+msg.obj+"\n耗时:"+UploadUtil.getRequestTime()+"秒";  
  165.                 uploadImageResult.setText(result);  
  166.                 break;  
  167.             default:  
  168.                 break;  
  169.             }  
  170.             super.handleMessage(msg);  
  171.         }  
  172.           
  173.     };  
  174.   
  175.     @Override  
  176.     public void onUploadProcess(int uploadSize) {  
  177.         Message msg = Message.obtain();  
  178.         msg.what = UPLOAD_IN_PROCESS;  
  179.         msg.arg1 = uploadSize;  
  180.         handler.sendMessage(msg );  
  181.     }  
  182.   
  183.     @Override  
  184.     public void initUpload(int fileSize) {  
  185.         Message msg = Message.obtain();  
  186.         msg.what = UPLOAD_INIT_PROCESS;  
  187.         msg.arg1 = fileSize;  
  188.         handler.sendMessage(msg );  
  189.     }  
  190.       
  191. }  


2.选择图片界面,主要涉及两种方式:选择图片和及时拍照图片

[java]  view plain copy
  1. package com.spring.sky.image.upload;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.ContentValues;  
  5. import android.content.Intent;  
  6. import android.database.Cursor;  
  7. import android.net.Uri;  
  8. import android.os.Bundle;  
  9. import android.os.Environment;  
  10. import android.provider.MediaStore;  
  11. import android.util.Log;  
  12. import android.view.MotionEvent;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.LinearLayout;  
  17. import android.widget.Toast;  
  18.   
  19. /** 
  20.  * @author spring sky<br> 
  21.  * Email :vipa1888@163.com<br> 
  22.  * QQ: 840950105<br> 
  23.  * @version 创建时间:2012-11-22 上午9:20:03 
  24.  * 说明:主要用于选择文件操作 
  25.  */  
  26.   
  27. public class SelectPicActivity extends Activity implements OnClickListener{  
  28.   
  29.     /*** 
  30.      * 使用照相机拍照获取图片 
  31.      */  
  32.     public static final int SELECT_PIC_BY_TACK_PHOTO = 1;  
  33.     /*** 
  34.      * 使用相册中的图片 
  35.      */  
  36.     public static final int SELECT_PIC_BY_PICK_PHOTO = 2;  
  37.       
  38.     /*** 
  39.      * 从Intent获取图片路径的KEY 
  40.      */  
  41.     public static final String KEY_PHOTO_PATH = "photo_path";  
  42.       
  43.     private static final String TAG = "SelectPicActivity";  
  44.       
  45.     private LinearLayout dialogLayout;  
  46.     private Button takePhotoBtn,pickPhotoBtn,cancelBtn;  
  47.   
  48.     /**获取到的图片路径*/  
  49.     private String picPath;  
  50.       
  51.     private Intent lastIntent ;  
  52.       
  53.     private Uri photoUri;  
  54.     @Override  
  55.     protected void onCreate(Bundle savedInstanceState) {  
  56.         super.onCreate(savedInstanceState);  
  57.         setContentView(R.layout.select_pic_layout);  
  58.         initView();  
  59.     }  
  60.     /** 
  61.      * 初始化加载View 
  62.      */  
  63.     private void initView() {  
  64.         dialogLayout = (LinearLayout) findViewById(R.id.dialog_layout);  
  65.         dialogLayout.setOnClickListener(this);  
  66.         takePhotoBtn = (Button) findViewById(R.id.btn_take_photo);  
  67.         takePhotoBtn.setOnClickListener(this);  
  68.         pickPhotoBtn = (Button) findViewById(R.id.btn_pick_photo);  
  69.         pickPhotoBtn.setOnClickListener(this);  
  70.         cancelBtn = (Button) findViewById(R.id.btn_cancel);  
  71.         cancelBtn.setOnClickListener(this);  
  72.           
  73.         lastIntent = getIntent();  
  74.     }  
  75.   
  76.     @Override  
  77.     public void onClick(View v) {  
  78.         switch (v.getId()) {  
  79.         case R.id.dialog_layout:  
  80.             finish();  
  81.             break;  
  82.         case R.id.btn_take_photo:  
  83.             takePhoto();  
  84.             break;  
  85.         case R.id.btn_pick_photo:  
  86.             pickPhoto();  
  87.             break;  
  88.         default:  
  89.             finish();  
  90.             break;  
  91.         }  
  92.     }  
  93.   
  94.     /** 
  95.      * 拍照获取图片 
  96.      */  
  97.     private void takePhoto() {  
  98.         //执行拍照前,应该先判断SD卡是否存在  
  99.         String SDState = Environment.getExternalStorageState();  
  100.         if(SDState.equals(Environment.MEDIA_MOUNTED))  
  101.         {  
  102.               
  103.             Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//"android.media.action.IMAGE_CAPTURE"  
  104.             /*** 
  105.              * 需要说明一下,以下操作使用照相机拍照,拍照后的图片会存放在相册中的 
  106.              * 这里使用的这种方式有一个好处就是获取的图片是拍照后的原图 
  107.              * 如果不实用ContentValues存放照片路径的话,拍照后获取的图片为缩略图不清晰 
  108.              */  
  109.             ContentValues values = new ContentValues();    
  110.             photoUri = this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);    
  111.             intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoUri);  
  112.             /**-----------------*/  
  113.             startActivityForResult(intent, SELECT_PIC_BY_TACK_PHOTO);  
  114.         }else{  
  115.             Toast.makeText(this,"内存卡不存在", Toast.LENGTH_LONG).show();  
  116.         }  
  117.     }  
  118.   
  119.     /*** 
  120.      * 从相册中取图片 
  121.      */  
  122.     private void pickPhoto() {  
  123.         Intent intent = new Intent();  
  124.         intent.setType("image/*");  
  125.         intent.setAction(Intent.ACTION_GET_CONTENT);  
  126.         startActivityForResult(intent, SELECT_PIC_BY_PICK_PHOTO);  
  127.     }  
  128.       
  129.     @Override  
  130.     public boolean onTouchEvent(MotionEvent event) {  
  131.         finish();  
  132.         return super.onTouchEvent(event);  
  133.     }  
  134.       
  135.       
  136.     @Override  
  137.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  138.         if(resultCode == Activity.RESULT_OK)  
  139.         {  
  140.             doPhoto(requestCode,data);  
  141.         }  
  142.         super.onActivityResult(requestCode, resultCode, data);  
  143.     }  
  144.       
  145.     /**  
  146.      * 选择图片后,获取图片的路径  
  147.      * @param requestCode  
  148.      * @param data  
  149.      */  
  150.     private void doPhoto(int requestCode,Intent data)  
  151.     {  
  152.         if(requestCode == SELECT_PIC_BY_PICK_PHOTO )  //从相册取图片,有些手机有异常情况,请注意  
  153.         {  
  154.             if(data == null)  
  155.             {  
  156.                 Toast.makeText(this"选择图片文件出错", Toast.LENGTH_LONG).show();  
  157.                 return;  
  158.             }  
  159.             photoUri = data.getData();  
  160.             if(photoUri == null )  
  161.             {  
  162.                 Toast.makeText(this"选择图片文件出错", Toast.LENGTH_LONG).show();  
  163.                 return;  
  164.             }  
  165.         }  
  166.         String[] pojo = {MediaStore.Images.Media.DATA};  
  167.         Cursor cursor = managedQuery(photoUri, pojo, nullnull,null);     
  168.         if(cursor != null )  
  169.         {  
  170.             int columnIndex = cursor.getColumnIndexOrThrow(pojo[0]);  
  171.             cursor.moveToFirst();  
  172.             picPath = cursor.getString(columnIndex);  
  173.             cursor.close();  
  174.         }  
  175.         Log.i(TAG, "imagePath = "+picPath);  
  176.         if(picPath != null && ( picPath.endsWith(".png") || picPath.endsWith(".PNG") ||picPath.endsWith(".jpg") ||picPath.endsWith(".JPG")  ))  
  177.         {  
  178.             lastIntent.putExtra(KEY_PHOTO_PATH, picPath);  
  179.             setResult(Activity.RESULT_OK, lastIntent);  
  180.             finish();  
  181.         }else{  
  182.             Toast.makeText(this"选择图片文件不正确", Toast.LENGTH_LONG).show();  
  183.         }  
  184.     }  
  185. }  


3. 上传工具类,主要实现了图片的上传,上传过程的初始化监听和上传完成的监听,还有上传耗时的计算

[java]  view plain copy
  1. package com.spring.sky.image.upload.network;  
  2.   
  3. import java.io.DataOutputStream;  
  4. import java.io.File;  
  5. import java.io.FileInputStream;  
  6. import java.io.IOException;  
  7. import java.io.InputStream;  
  8. import java.net.HttpURLConnection;  
  9. import java.net.MalformedURLException;  
  10. import java.net.URL;  
  11. import java.util.Iterator;  
  12. import java.util.Map;  
  13. import java.util.UUID;  
  14.   
  15. import android.util.Log;  
  16.   
  17. /** 
  18.  *  
  19.  * 上传工具类 
  20.  * @author spring sky<br> 
  21.  * Email :vipa1888@163.com<br> 
  22.  * QQ: 840950105<br> 
  23.  * 支持上传文件和参数 
  24.  */  
  25. public class UploadUtil {  
  26.     private static UploadUtil uploadUtil;  
  27.     private static final String BOUNDARY =  UUID.randomUUID().toString(); // 边界标识 随机生成  
  28.     private static final String PREFIX = "--";  
  29.     private static final String LINE_END = "\r\n";  
  30.     private static final String CONTENT_TYPE = "multipart/form-data"// 内容类型  
  31.     private UploadUtil() {  
  32.   
  33.     }  
  34.   
  35.     /** 
  36.      * 单例模式获取上传工具类 
  37.      * @return 
  38.      */  
  39.     public static UploadUtil getInstance() {  
  40.         if (null == uploadUtil) {  
  41.             uploadUtil = new UploadUtil();  
  42.         }  
  43.         return uploadUtil;  
  44.     }  
  45.   
  46.     private static final String TAG = "UploadUtil";  
  47.     private int readTimeOut = 10 * 1000// 读取超时  
  48.     private int connectTimeout = 10 * 1000// 超时时间  
  49.     /*** 
  50.      * 请求使用多长时间 
  51.      */  
  52.     private static int requestTime = 0;  
  53.       
  54.     private static final String CHARSET = "utf-8"// 设置编码  
  55.   
  56.     /*** 
  57.      * 上传成功 
  58.      */  
  59.     public static final int UPLOAD_SUCCESS_CODE = 1;  
  60.     /** 
  61.      * 文件不存在 
  62.      */  
  63.     public static final int UPLOAD_FILE_NOT_EXISTS_CODE = 2;  
  64.     /** 
  65.      * 服务器出错 
  66.      */  
  67.     public static final int UPLOAD_SERVER_ERROR_CODE = 3;  
  68.     protected static final int WHAT_TO_UPLOAD = 1;  
  69.     protected static final int WHAT_UPLOAD_DONE = 2;  
  70.       
  71.     /** 
  72.      * android上传文件到服务器 
  73.      *  
  74.      * @param filePath 
  75.      *            需要上传的文件的路径 
  76.      * @param fileKey 
  77.      *            在网页上<input type=file name=xxx/> xxx就是这里的fileKey 
  78.      * @param RequestURL 
  79.      *            请求的URL 
  80.      */  
  81.     public void uploadFile(String filePath, String fileKey, String RequestURL,  
  82.             Map<String, String> param) {  
  83.         if (filePath == null) {  
  84.             sendMessage(UPLOAD_FILE_NOT_EXISTS_CODE,"文件不存在");  
  85.             return;  
  86.         }  
  87.         try {  
  88.             File file = new File(filePath);  
  89.             uploadFile(file, fileKey, RequestURL, param);  
  90.         } catch (Exception e) {  
  91.             sendMessage(UPLOAD_FILE_NOT_EXISTS_CODE,"文件不存在");  
  92.             e.printStackTrace();  
  93.             return;  
  94.         }  
  95.     }  
  96.   
  97.     /** 
  98.      * android上传文件到服务器 
  99.      *  
  100.      * @param file 
  101.      *            需要上传的文件 
  102.      * @param fileKey 
  103.      *            在网页上<input type=file name=xxx/> xxx就是这里的fileKey 
  104.      * @param RequestURL 
  105.      *            请求的URL 
  106.      */  
  107.     public void uploadFile(final File file, final String fileKey,  
  108.             final String RequestURL, final Map<String, String> param) {  
  109.         if (file == null || (!file.exists())) {  
  110.             sendMessage(UPLOAD_FILE_NOT_EXISTS_CODE,"文件不存在");  
  111.             return;  
  112.         }  
  113.   
  114.         Log.i(TAG, "请求的URL=" + RequestURL);  
  115.         Log.i(TAG, "请求的fileName=" + file.getName());  
  116.         Log.i(TAG, "请求的fileKey=" + fileKey);  
  117.         new Thread(new Runnable() {  //开启线程上传文件  
  118.             @Override  
  119.             public void run() {  
  120.                 toUploadFile(file, fileKey, RequestURL, param);  
  121.             }  
  122.         }).start();  
  123.           
  124.     }  
  125.   
  126.     private void toUploadFile(File file, String fileKey, String RequestURL,  
  127.             Map<String, String> param) {  
  128.         String result = null;  
  129.         requestTime= 0;  
  130.           
  131.         long requestTime = System.currentTimeMillis();  
  132.         long responseTime = 0;  
  133.   
  134.         try {  
  135.             URL url = new URL(RequestURL);  
  136.             HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  137.             conn.setReadTimeout(readTimeOut);  
  138.             conn.setConnectTimeout(connectTimeout);  
  139.             conn.setDoInput(true); // 允许输入流  
  140.             conn.setDoOutput(true); // 允许输出流  
  141.             conn.setUseCaches(false); // 不允许使用缓存  
  142.             conn.setRequestMethod("POST"); // 请求方式  
  143.             conn.setRequestProperty("Charset", CHARSET); // 设置编码  
  144.             conn.setRequestProperty("connection""keep-alive");  
  145.             conn.setRequestProperty("user-agent""Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");  
  146.             conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);  
  147. //          conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");  
  148.               
  149.             /** 
  150.              * 当文件不为空,把文件包装并且上传 
  151.              */  
  152.             DataOutputStream dos = new DataOutputStream(conn.getOutputStream());  
  153.             StringBuffer sb = null;  
  154.             String params = "";  
  155.               
  156.             /*** 
  157.              * 以下是用于上传参数 
  158.              */  
  159.             if (param != null && param.size() > 0) {  
  160.                 Iterator<String> it = param.keySet().iterator();  
  161.                 while (it.hasNext()) {  
  162.                     sb = null;  
  163.                     sb = new StringBuffer();  
  164.                     String key = it.next();  
  165.                     String value = param.get(key);  
  166.                     sb.append(PREFIX).append(BOUNDARY).append(LINE_END);  
  167.                     sb.append("Content-Disposition: form-data; name=\"").append(key).append("\"").append(LINE_END).append(LINE_END);  
  168.                     sb.append(value).append(LINE_END);  
  169.                     params = sb.toString();  
  170.                     Log.i(TAG, key+"="+params+"##");  
  171.                     dos.write(params.getBytes());  
  172. //                  dos.flush();  
  173.                 }  
  174.             }  
  175.               
  176.             sb = null;  
  177.             params = null;  
  178.             sb = new StringBuffer();  
  179.             /** 
  180.              * 这里重点注意: name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件 
  181.              * filename是文件的名字,包含后缀名的 比如:abc.png 
  182.              */  
  183.             sb.append(PREFIX).append(BOUNDARY).append(LINE_END);  
  184.             sb.append("Content-Disposition:form-data; name=\"" + fileKey  
  185.                     + "\"; filename=\"" + file.getName() + "\"" + LINE_END);  
  186.             sb.append("Content-Type:image/pjpeg" + LINE_END); // 这里配置的Content-type很重要的 ,用于服务器端辨别文件的类型的  
  187.             sb.append(LINE_END);  
  188.             params = sb.toString();  
  189.             sb = null;  
  190.               
  191.             Log.i(TAG, file.getName()+"=" + params+"##");  
  192.             dos.write(params.getBytes());  
  193.             /**上传文件*/  
  194.             InputStream is = new FileInputStream(file);  
  195.             onUploadProcessListener.initUpload((int)file.length());  
  196.             byte[] bytes = new byte[1024];  
  197.             int len = 0;  
  198.             int curLen = 0;  
  199.             while ((len = is.read(bytes)) != -1) {  
  200.                 curLen += len;  
  201.                 dos.write(bytes, 0, len);  
  202.                 onUploadProcessListener.onUploadProcess(curLen);  
  203.             }  
  204.             is.close();  
  205.               
  206.             dos.write(LINE_END.getBytes());  
  207.             byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes();  
  208.             dos.write(end_data);  
  209.             dos.flush();  
  210. //            
  211. //          dos.write(tempOutputStream.toByteArray());  
  212.             /** 
  213.              * 获取响应码 200=成功 当响应成功,获取响应的流 
  214.              */  
  215.             int res = conn.getResponseCode();  
  216.             responseTime = System.currentTimeMillis();  
  217.             this.requestTime = (int) ((responseTime-requestTime)/1000);  
  218.             Log.e(TAG, "response code:" + res);  
  219.             if (res == 200) {  
  220.                 Log.e(TAG, "request success");  
  221.                 InputStream input = conn.getInputStream();  
  222.                 StringBuffer sb1 = new StringBuffer();  
  223.                 int ss;  
  224.                 while ((ss = input.read()) != -1) {  
  225.                     sb1.append((char) ss);  
  226.                 }  
  227.                 result = sb1.toString();  
  228.                 Log.e(TAG, "result : " + result);  
  229.                 sendMessage(UPLOAD_SUCCESS_CODE, "上传结果:"  
  230.                         + result);  
  231.                 return;  
  232.             } else {  
  233.                 Log.e(TAG, "request error");  
  234.                 sendMessage(UPLOAD_SERVER_ERROR_CODE,"上传失败:code=" + res);  
  235.                 return;  
  236.             }  
  237.         } catch (MalformedURLException e) {  
  238.             sendMessage(UPLOAD_SERVER_ERROR_CODE,"上传失败:error=" + e.getMessage());  
  239.             e.printStackTrace();  
  240.             return;  
  241.         } catch (IOException e) {  
  242.             sendMessage(UPLOAD_SERVER_ERROR_CODE,"上传失败:error=" + e.getMessage());  
  243.             e.printStackTrace();  
  244.             return;  
  245.         }  
  246.     }  
  247.   
  248.     /** 
  249.      * 发送上传结果 
  250.      * @param responseCode 
  251.      * @param responseMessage 
  252.      */  
  253.     private void sendMessage(int responseCode,String responseMessage)  
  254.     {  
  255.         onUploadProcessListener.onUploadDone(responseCode, responseMessage);  
  256.     }  
  257.       
  258.     /** 
  259.      * 下面是一个自定义的回调函数,用到回调上传文件是否完成 
  260.      *  
  261.      * @author shimingzheng 
  262.      *  
  263.      */  
  264.     public static interface OnUploadProcessListener {  
  265.         /** 
  266.          * 上传响应 
  267.          * @param responseCode 
  268.          * @param message 
  269.          */  
  270.         void onUploadDone(int responseCode, String message);  
  271.         /** 
  272.          * 上传中 
  273.          * @param uploadSize 
  274.          */  
  275.         void onUploadProcess(int uploadSize);  
  276.         /** 
  277.          * 准备上传 
  278.          * @param fileSize 
  279.          */  
  280.         void initUpload(int fileSize);  
  281.     }  
  282.     private OnUploadProcessListener onUploadProcessListener;  
  283.       
  284.       
  285.   
  286.     public void setOnUploadProcessListener(  
  287.             OnUploadProcessListener onUploadProcessListener) {  
  288.         this.onUploadProcessListener = onUploadProcessListener;  
  289.     }  
  290.   
  291.     public int getReadTimeOut() {  
  292.         return readTimeOut;  
  293.     }  
  294.   
  295.     public void setReadTimeOut(int readTimeOut) {  
  296.         this.readTimeOut = readTimeOut;  
  297.     }  
  298.   
  299.     public int getConnectTimeout() {  
  300.         return connectTimeout;  
  301.     }  
  302.   
  303.     public void setConnectTimeout(int connectTimeout) {  
  304.         this.connectTimeout = connectTimeout;  
  305.     }  
  306.     /** 
  307.      * 获取上传使用的时间 
  308.      * @return 
  309.      */  
  310.     public static int getRequestTime() {  
  311.         return requestTime;  
  312.     }  
  313.       
  314.     public static interface uploadProcessListener{  
  315.           
  316.     }  
  317.       
  318.       
  319.       
  320.       
  321. }  


本文章欢迎转载,但是请保留原连接地址:http://blog.csdn.net/vipa1888/article/details/8213898

以上代码,我就不详细讲解原理,相关难点注释已经写得很清楚了!分享出来,和大家一起学习!

相关服务器端代码和客户端下载:

android客户端下载

javaEE服务器端


本人修改过的:

http://download.csdn.net/detail/jdsjlzx/5103005


相关文章
|
1月前
|
Ubuntu 网络协议 Java
【Android平板编程】远程Ubuntu服务器code-server编程写代码
【Android平板编程】远程Ubuntu服务器code-server编程写代码
|
2月前
|
测试技术 Android开发
Android Poco初始化时,不大起眼但可能存在坑点的参数们
Android Poco初始化时,不大起眼但可能存在坑点的参数们
|
2月前
|
弹性计算 Ubuntu Linux
2024年幻兽帕鲁一键搭建服务器+一键参数设置教程
《幻兽帕鲁》这款游戏是适合多年龄段玩家进行游玩的,小伙伴们一个人玩会感觉很无聊那不妨喊上自己的好朋友们一起来玩,在这款游戏中小伙伴们需要在广袤的地图上搜寻属于自己的“帕鲁”,培养他们进行创造、战斗、制作等,帮助你创造属于自己的家园。这款游戏目前还是十分火爆的那么本期就来讲讲幻兽帕鲁服务器搭建教程。
138 1
|
3月前
|
弹性计算 Ubuntu Linux
【幻兽帕鲁Palworld】搭建服务器配置参数说明,附阿里云幻兽帕鲁服务器搭建教程
创建幻兽帕鲁服务器配置参数说明,Palworld服务器配置参数与解释:
608 0
|
2天前
|
Android开发
Android 动态修改参数配置
Android 动态修改参数配置
11 0
|
6天前
|
小程序 开发者
体验版小程序为何无法访问云端服务器后端接口(请求失败...(已完美解决附加图片))?
体验版小程序为何无法访问云端服务器后端接口(请求失败...(已完美解决附加图片))?
12 0
|
1月前
|
弹性计算 缓存 数据库
阿里云服务器2核4G配置租用价格表_2核4G性能参数说明
阿里云服务器2核4G配置租用价格表_2核4G性能参数说明,2核4G配置1个月多少钱?2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年
|
1月前
|
Ubuntu 网络协议 Java
在Android平板上使用code-server公网远程Ubuntu服务器编程
在Android平板上使用code-server公网远程Ubuntu服务器编程
|
2月前
|
定位技术 数据安全/隐私保护
幻兽帕鲁服务器参数配置指南&参数解读&参数推荐
幻兽帕鲁服务器支持非常多的参数配置,本文带来了详细的参数解读、配置教程,以及亲身体验后的参数搭配,大幅增加你的游戏体验!
|
2月前
|
弹性计算 Linux 数据安全/隐私保护
零门槛!幻兽帕鲁服务器搭建与服务器参数修改教程
零门槛!幻兽帕鲁服务器搭建与服务器参数修改教程
165 1
零门槛!幻兽帕鲁服务器搭建与服务器参数修改教程