import android.os.Message; import android.util.Log; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.Map; import java.util.UUID; import android.os.Handler; //示例调用第二种方式上传: // //final Map<String, String> params = new HashMap<String, String>(); // params.put("send_userId", String.valueOf(id)); // params.put("send_email", address); // params.put("send_name", name); // params.put("receive_email", emails); // // //final Map<String, File> files = new HashMap<String, File>(); // files.put("uploadfile", file); //final String request = UploadUtil.post(requestURL, params, files); /** * 上传文件到服务器类 * * @author tom */ public class UploadUtil extends Thread { private static final String TAG = "uploadFile"; private static final int TIME_OUT = 10 * 1000; // 超时时间 private static final String CHARSET = "utf-8"; // 设置编码 private String p_url; private Map<String, String> p_params; private Map<String, File> p_files; private Handler mHandler; public Map response; public static String MSG; @Override public void run() { try { this.response = this.post(this.p_url, this.p_params, this.p_files); Message message = this.mHandler.obtainMessage(); message.obj = this.response; this.mHandler.sendMessage(message); } catch (IOException e) { e.printStackTrace(); } } public UploadUtil(String url, Map<String, String> params, Map<String, File> files, Handler mHandler) { this.p_url = url; this.p_params = params; this.p_files = files; this.mHandler = mHandler; } /** * 通过拼接的方式构造请求内容,实现参数传输以及文件传输 * * @param url Service net address * @param params text content * @param files pictures * @return String result of Service response * @throws IOException */ public Map<Integer, Object> post(String url, Map<String, String> params, Map<String, File> files) throws IOException { String BOUNDARY = UUID.randomUUID().toString(); String PREFIX = "--", LINEND = "\r\n"; String MULTIPART_FROM_DATA = "multipart/form-data"; String CHARSET = "UTF-8"; URL uri = new URL(url); HttpURLConnection conn = (HttpURLConnection) uri.openConnection(); conn.setReadTimeout(10 * 1000); // 缓存的最长时间 conn.setDoInput(true);// 允许输入 conn.setDoOutput(true);// 允许输出 conn.setUseCaches(false); // 不允许使用缓存 conn.setRequestMethod("POST"); conn.setRequestProperty("connection", "keep-alive"); conn.setRequestProperty("Charsert", "UTF-8"); conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY); // 首先组拼文本类型的参数 StringBuilder sb = new StringBuilder(); for (Map.Entry<String, String> entry : params.entrySet()) { sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINEND); sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND); sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND); sb.append("Content-Transfer-Encoding: 8bit" + LINEND); sb.append(LINEND); sb.append(entry.getValue()); sb.append(LINEND); } OutputStream ops = conn.getOutputStream(); DataOutputStream outStream = new DataOutputStream(ops); outStream.write(sb.toString().getBytes()); // 发送文件数据 if (files != null) for (Map.Entry<String, File> file : files.entrySet()) { StringBuilder sb1 = new StringBuilder(); sb1.append(PREFIX); sb1.append(BOUNDARY); sb1.append(LINEND); sb1.append("Content-Disposition: form-data; name=\"uploadfile\"; filename=\"" + file.getValue().getName() + "\"" + LINEND); sb1.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINEND); sb1.append(LINEND); outStream.write(sb1.toString().getBytes()); InputStream is = new FileInputStream(file.getValue()); byte[] buffer = new byte[1024]; int len = 0; while ((len = is.read(buffer)) != -1) { outStream.write(buffer, 0, len); } is.close(); outStream.write(LINEND.getBytes()); } // 请求结束标志 byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes(); outStream.write(end_data); outStream.flush(); //等待服务器响应~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` // 得到响应码 int res = conn.getResponseCode(); UtilsTools.Log_e(TAG, "res=====响应码>>:" + res); InputStream in = conn.getInputStream(); StringBuilder sb2 = new StringBuilder(); if (res == 200) { int ch; while ((ch = in.read()) != -1) { sb2.append((char) ch); } } UtilsTools.Log_e(TAG, "================>" + sb2); MSG = sb2.toString(); outStream.close(); conn.disconnect(); Map<Integer, Object> message = new HashMap<Integer, Object>() { }; message.put(0, res); message.put(1, sb2.toString()); return message; } }
Android上传图片文件工具类
最新推荐文章于 2022-08-02 15:47:37 发布