public class FormFile { // 上传文件的数据 private byte[] data; private InputStream inStream; // 文件名称 private String filename; // 表单名称 private String formname; // 内容类型 private String contentType = "application/octet-stream"; public FormFile(String filename, byte[] data, String formname, String contentType) { this.data = data; this.filename = filename; this.formname = formname; if (contentType != null) { this.contentType = contentType; } } public FormFile(String filename, InputStream inStream, String formname, String contentType) { this.filename = filename; this.formname = formname; this.inStream = inStream; if (contentType != null) { this.contentType = contentType; } } public byte[] getData() { return data; } public void setData(byte[] data) { this.data = data; } public InputStream getInStream() { return inStream; } public void setInStream(InputStream inStream) { this.inStream = inStream; } public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } public String getFormname() { return formname; } public void setFormname(String formname) { this.formname = formname; } public String getContentType() { return contentType; } public void setContentType(String contentType) { this.contentType = contentType; } }
public class HttpUploadRequester { /** * 直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能: <FORM METHOD=POST * ACTION="http://192.168.0.200:8080/ssi/fileload/test.do" * enctype="multipart/form-data"> <INPUT TYPE="text" NAME="name"> <INPUT * TYPE="text" NAME="id"> <input type="file" name="imagefile"/> <input * type="file" name="zip"/> </FORM> * * @param actionUrl * 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器, * 你可以使用http://192.168.1.10:8080这样的路径测试) * @param params * 请求参数 key为参数名,value为参数值 * @param file * 上传文件 */ // http协议中分割符,随便定义 private static final String HTTP_BOUNDARY = "---------9dx5a2d578c2"; private static final String MULTIPART_FORM_DATA = "multipart/form-data"; private static final String LINE_ENTER = "\r\n"; // 换行 回车 private static final int RESPONSE_OK = 200; public static String post(String urlPath, Map<String, String> params, FormFile[] formFiles) { try { URL url = new URL(urlPath); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setReadTimeout(5 * 1000); conn.setDoOutput(true); // 发送POST请求, 必须设置允许输出 conn.setUseCaches(false); conn.setRequestProperty("Connection", "Keep-Alive"); // 维持长链接 conn.setRequestProperty("Charset", "UTF-8"); conn.setRequestProperty("Content-Type", MULTIPART_FORM_DATA + "; boundary=" + HTTP_BOUNDARY); StringBuilder formItemData = new StringBuilder(); // 构建 表单字段内容 for (Map.Entry<String, String> entry : params.entrySet()) { formItemData.append("--"); formItemData.append(HTTP_BOUNDARY); formItemData.append(LINE_ENTER); formItemData.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"\r\n\r\n"); formItemData.append(entry.getValue()); formItemData.append(LINE_ENTER); } DataOutputStream outStream = new DataOutputStream( conn.getOutputStream()); // 发送表单字段内容到服务器 outStream.write(formItemData.toString().getBytes()); // 发送上传文件数据 for (FormFile fileData : formFiles) { StringBuilder fileSplit = new StringBuilder(); fileSplit.append("--"); fileSplit.append(HTTP_BOUNDARY); fileSplit.append(LINE_ENTER); fileSplit.append("Content-Disposition: form-data;name=\"" + fileData.getFormname() + "\";filename=\"" + fileData.getFilename() + "\"\r\n"); fileSplit.append("Content-Type:" + fileData.getContentType() + LINE_ENTER + LINE_ENTER); outStream.write(fileSplit.toString().getBytes()); if (fileData.getInStream() != null) { byte[] buffer = new byte[1024]; int length = 0; while ((length = fileData.getInStream().read()) != -1) { outStream.write(buffer, 0, length); } fileData.getInStream().close(); } else { outStream.write(fileData.getData(), 0, fileData.getData().length); } outStream.write(LINE_ENTER.getBytes()); } // 数据结束标志 byte[] endData = ("--" + HTTP_BOUNDARY + "--" + LINE_ENTER) .getBytes(); outStream.write(endData); outStream.flush(); outStream.close(); int responseCode = conn.getResponseCode(); if (responseCode != RESPONSE_OK) { throw new RuntimeException("请求url失败"); } InputStream is = conn.getInputStream(); int ch; StringBuilder b = new StringBuilder(); while ((ch = is.read()) != -1) { b.append((char) ch); } Log.i("HttpPost", b.toString()); conn.disconnect(); return b.toString(); } catch (Exception e) { throw new RuntimeException(); } } // 上传单个文件 public static String post(String urlPath, Map<String, String> params, FormFile formFiles) { return post(urlPath, params, new FormFile[] { formFiles }); } }
// 以表单方式发送请求 public static void sendDataToServerByForm() throws Exception { Map<String, String> params = new HashMap<String, String>(); params.put("method", "sendDataByForm"); params.put("strData", "字符串数据"); // 获取SDCard中的good.jpg File file = new File(Environment.getExternalStorageDirectory(), "app_Goog_Android_w.png"); FormFile fileData = new FormFile("app_Goog_Android_w.png", new FileInputStream(file), "fileData", "application/octet-stream"); HttpUploadRequester.post( "http://192.168.0.2:8080/AndroidWebServer/server.do", params, fileData); }