- /**
- *
- * 同步上传多个文件
- * 基于标准的http实现,需要在非UI线程中调用,以免阻塞UI。
- *
- */
- public class MyUploader {
- private static final String TAG = "MyUploader";
- // ////////////////////同步上传多个文件/////////
- /**
- * 同步上传File
- *
- * @param Url
- * @param fullFileName
- * : 全路径,ex. /sdcard/f/yh.jpg
- * @param fileName
- * : file name, ex. yh.jpg
- * @return 服务器的响应结果(字符串形式)
- */
- public String MyUploadMultiFileSync(String Url,
- List<String> fileList, Map<String, String> params) {
- String reulstCode = "";
- String end = "\r\n";
- String twoHyphens = "--";
- String boundary = "--------boundary";
- try {
- URL url = new URL(actionUrl);
- HttpURLConnection con = (HttpURLConnection) url.openConnection();
- // 允许Input、Output,不使用Cache
- con.setDoInput(true);
- con.setDoOutput(true);
- con.setUseCaches(false);
- // 设置传送的method=POST
- con.setRequestMethod("POST");
- // setRequestProperty
- con.setRequestProperty("Connection", "Keep-Alive");
- con.setRequestProperty("Charset", "UTF-8");
- // con.setRequestProperty("Content-Type",
- // "application/x-www-form-urlencoded");
- con.setRequestProperty("Content-Type",
- "multipart/form-data;boundary=" + boundary);
- StringBuffer s = new StringBuffer();
- // 设置DataOutputStream
- DataOutputStream dos = new DataOutputStream(con.getOutputStream());
- for (int i = 0; i < fileList.size(); i++) {
- String filePath = fileList.get(i);
- int endFileIndex = filePath.lastIndexOf("/");
- String fileName = filePath.substring(endFileIndex + 1);
- Log.i(TAG, "filename= " + fileName);
- // set 头部
- StringBuilder sb = new StringBuilder();
- sb.append(twoHyphens);
- sb.append(boundary);
- sb.append(end);
- sb.append("Content-Disposition: form-data; ");
- sb.append("name=" + "\"" + "upload_file" +i + "\"");
- sb.append(";filename=");
- sb.append("\"" + fileName + "\"");
- sb.append(end);
- sb.append("Content-Type: ");
- sb.append("image/jpeg");
- sb.append(end);
- sb.append(end);
- // 1. write sb
- dos.writeBytes(sb.toString());
- // 取得文件的FileInputStream
- FileInputStream fis = new FileInputStream(filePath);
- // 设置每次写入1024bytes
- int bufferSize = 1024;
- byte[] buffer = new byte[bufferSize];
- int length = -1;
- // 从文件读取数据至缓冲区
- while ((length = fis.read(buffer)) != -1) {
- dos.write(buffer, 0, length);
- }
- dos.writeBytes(end);
- fis.close();
- dos.writeBytes(end);
- dos.writeBytes(end);
- //dos.writeBytes(end);
- //dos.flush();
- // close streams
- //fis.close();
- }
- // set 尾部
- StringBuilder sb2 = new StringBuilder();
- if (params != null && !params.isEmpty()) {
- for (String key : params.keySet()) {
- String value = params.get(key);
- sb2.append(twoHyphens);
- sb2.append(boundary);
- sb2.append(end);
- sb2.append("Content-Disposition: form-data; ");
- sb2.append("name=" + "\"");
- sb2.append(key + "\"");
- sb2.append(end);
- sb2.append(end);
- sb2.append(value);
- sb2.append(end);
- }
- }
- sb2.append(twoHyphens + boundary + end);
- dos.writeBytes(sb2.toString());
- dos.flush();
- Log.i(TAG, "sb2:" + sb2.toString());
- // 取得Response内容
- InputStream is = con.getInputStream();
- int ch;
- StringBuffer b = new StringBuffer();
- while ((ch = is.read()) != -1) {
- b.append((char) ch);
- }
- reulstCode = b.toString().trim();
- // 关闭
- dos.close();
- } catch (IOException e) {
- Log.i(TAG, "IOException: " + e);
- e.printStackTrace();
- }
- return reulstCode;
- }
- }
由于MyUploader的MyUploadMultiFileSync本身是同步的函数请求,所以,这个函数需要在非UI线程中执行。本例采用Thread+Handler的方式来进行说明。
下面是activity的主要代码,功能是将cache目录中的的jpg文件上传到指定的服务器:
- public void uploadThreadTest() {
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- upload();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }).start();
- }
- private void upload() {
- String url = "https://httpbin.org/post";
- List<String> fileList = getCacheFiles();
- if (fileList == null) {
- myHandler.sendEmptyMessage(-1);
- }else {
- MyUploader myUpload = new MyUploader();
- //同步请求,直接返回结果,根据结果来判断是否成功。
- String reulstCode = myUpload.MyUploadMultiFileSync(url, fileList, null);
- Log.i(TAG, "upload reulstCode: " + reulstCode);
- myHandler.sendEmptyMessage(0);
- }
- }
- private List<String> getCacheFiles() {
- List<String> fileList = new ArrayList<String>();
- File catchPath = mContext.getCacheDir();
- if (catchPath!=null && catchPath.isDirectory()) {
- File[] files = catchPath.listFiles();
- if (files == null || files.length<1) {
- return null;
- }
- for (int i = 0; i < files.length; i++) {
- if (files[i].isFile() && files[i].getAbsolutePath().endsWith(".jpg")) {
- fileList.add(files[i].getAbsolutePath());
- }
- }
- return fileList;
- }
- return null;
- }
- ////////////handler/////
- private Handler myHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- Log.i(TAG,"handleMessage msg===" + msg);
- if (msg.what == -1) {
- Toast.makeText(mContext, "not find file!", Toast.LENGTH_LONG).show();
- return;
- }else {
- Toast.makeText(mContext, "upload success!", Toast.LENGTH_LONG).show();
- }
- }
- };
https://github.com/ranke/HttpAsyncTest
来源: http://www.phpxs.com/code/1001847/