使用HttpURLConnection上传文件(带提示进度对话框)

来源:互联网 发布:淘宝卖家如何激活认证 编辑:程序博客网 时间:2024/05/22 05:13

该示例直接使用流以POST方式进行文件上传,代码如下:

MainActivity:

package com.home.uploadfile;import java.io.File;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener {private Button uploadBtn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);uploadBtn = (Button) findViewById(R.id.main_btn_upload);uploadBtn.setOnClickListener(this);}@Overridepublic void onClick(View v) {if (v == uploadBtn) {String requestUrl = "http://service.ireadhome.com/api/Upload/Image";String filePath = "/storage/sdcard0/updateAdtech/orgpic/1.png";File file = new File(filePath);if (!file.exists()) {Toast.makeText(MainActivity.this, "文件不存在", Toast.LENGTH_SHORT).show();return;}LoadDialog dialog = new LoadDialog(MainActivity.this);dialog.execute(new LoadDialog.Callback() {@Overridepublic void getResult(Object obj) {System.out.println(obj + "");}}, NetService.class, "postUseUrlConnection", requestUrl, file);}}}

LoadDialog:

package com.home.uploadfile;import java.lang.reflect.Method;import android.app.ProgressDialog;import android.content.Context;import android.os.AsyncTask;/** * 封装ProecssDialog对话框 *  * @author Administrator *  */public class LoadDialog extends ProgressDialog {private String title = "进度对话框";private String message = "文件上传中。。。";public LoadDialog(Context context, int theme) {super(context, theme);}/** * 用默认的标题和内容来创建对话框 *  * @param context */public LoadDialog(Context context) {super(context);initDialog();}/** * 用指定的标题和内容来创建对话框 *  * @param context * @param title * @param message */public LoadDialog(Context context, String title, String message) {super(context);if (title != null) {this.title = title;}if (message != null) {this.message = message;}initDialog();}/** * 初始化对话框参数,默认对话框不可以取消 */public void initDialog() {setTitle(title);setMessage(message);setProgressStyle(ProgressDialog.STYLE_SPINNER);setCancelable(false);}/** * 打开对话框,设置回调方法,传递需要执行业务方法的类模板,方法名和参数列表 *  * @param callback *            回调方法,该方法在对话框关闭后回调,并获取返回的数据 * @param serviceClass *            执行业务方法的类模板 * @param method *            执行业务方法的方法名 * @param params *            执行业务方法的参数列表 */public void execute(Callback callback, Class serviceClass, String method,Object... params) {super.show();ServiceAysnTask task = new ServiceAysnTask(callback, serviceClass,method);task.execute(params);}/** * 回调方法的接口 *  * @author Administrator *  */public interface Callback {public void getResult(Object obj);}/** * 与远程服务通信的线程类 *  * @author Administrator *  */private class ServiceAysnTask extends AsyncTask<Object, Object, Object> {private Class serviceClass;private String method;private Callback callback;public ServiceAysnTask(Callback callback, Class serviceClass,String method) {this.callback = callback;this.serviceClass = serviceClass;this.method = method;}@Overrideprotected Object doInBackground(Object... params) {Object resultObj = null;try {Object obj = serviceClass.newInstance();Class[] paramTypes = new Class[params.length];for (int i = 0; i < paramTypes.length; i++) {paramTypes[i] = params[i].getClass();}Method m = serviceClass.getMethod(method, paramTypes);resultObj = m.invoke(obj, params);} catch (Exception e) {e.printStackTrace();}LoadDialog.this.cancel();return resultObj;}@Overrideprotected void onPostExecute(Object resultObj) {super.onPostExecute(resultObj);callback.getResult(resultObj);}}}

NetService:

package com.home.uploadfile;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;public class NetService {/** * 以POST方式上传文件 *  * @param requestUrl * @param file * @return */public static String postUseUrlConnection(String requestUrl, File file) {String end = "\r\n";String twoHyphens = "--";String boundary = "*****";String newName = "image.jpg";StringBuffer sb = new StringBuffer();try {URL url = new URL(requestUrl);HttpURLConnection con = (HttpURLConnection) url.openConnection();// 允许Input、Output,不使用Cachecon.setDoInput(true);con.setDoOutput(true);con.setUseCaches(false);// 设置以POST方式进行传送con.setRequestMethod("POST");// 设置RequestPropertycon.setRequestProperty("Connection", "Keep-Alive");con.setRequestProperty("Charset", "UTF-8");con.setRequestProperty("Content-Type","multipart/form-data;boundary=" + boundary);// 构造DataOutputStream流DataOutputStream ds = new DataOutputStream(con.getOutputStream());ds.writeBytes(twoHyphens + boundary + end);ds.writeBytes("Content-Disposition: form-data; "+ "name=\"file1\";filename=\"" + newName + "\"" + end);ds.writeBytes(end);// 构造要上传文件的FileInputStream流FileInputStream fis = new FileInputStream(file);// 设置每次写入1024bytesint bufferSize = 1024;byte[] buffer = new byte[bufferSize];int length = -1;// 从文件读取数据至缓冲区while ((length = fis.read(buffer)) != -1) {// 将资料写入DataOutputStream中ds.write(buffer, 0, length);}ds.writeBytes(end);ds.writeBytes(twoHyphens + boundary + twoHyphens + end);// 关闭流fis.close();ds.flush();// 获取响应流InputStream is = con.getInputStream();int ch;while ((ch = is.read()) != -1) {sb.append((char) ch);}// 关闭DataOutputStreamds.close();return sb.toString();} catch (Exception e) {e.printStackTrace();}return sb.toString();}}

权限:

<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />





 

原创粉丝点击