Android客户端上传数据到服务器:可以上传简单的表单,也可以方便的上传带有附件的文件
2014-04-30 14:50
579 查看
/** * */ package com.test.phoneuibyhtmldemo; import java.io.DataOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.util.Map; import org.apache.struts.upload.FormFile; /** * @author Administrator * */ public class HttpRequester { /** * 直接通过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 files * 上传文件 * @return */ public static String post(String actionUrl, Map<String, String> params, FormFile[] files) { try { String BOUNDARY = "----------------7da4qa4r59da";// 数据分割线 String MULTIPART_FORM_DATA = "multipart/form-data"; URL url = new URL(actionUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5 * 1000); conn.setDoInput(true);// 允许输入 conn.setDoOutput(true);// 允许输出 conn.setUseCaches(false);// 不使用Caches conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Charset", "UTF-8"); conn.setRequestProperty("Content-Type", MULTIPART_FORM_DATA + ";boundary=" + BOUNDARY); StringBuilder sb = new StringBuilder(); for (Map.Entry<String, String> entry : params.entrySet()) { // 构建表单字段内容 sb.append("--"); sb.append(BOUNDARY); sb.append("\r\n"); sb.append("Content-Disposition: form-data;name=\"" + entry.getKey() + "\"\r\n\r\n"); sb.append(entry.getValue()); sb.append("\r\n"); } DataOutputStream outStream = new DataOutputStream( conn.getOutputStream()); outStream.write(sb.toString().getBytes()); // 发送表单字段数据 for (FormFile file : files) {// 发送文件数据 StringBuilder splite = new StringBuilder(); splite.append("--"); splite.append(BOUNDARY); splite.append("\r\n"); splite.append("Content-Disposition: form-data;name=\"" + file.getFileData() + "\";filename=\""// 如有疑问,可换为file.getFormname(); + file.getFileName() + "\"\r\n"); splite.append("Content-Type:" + file.getContentType() + "\r\n\r\n"); outStream.write(splite.toString().getBytes()); if (file.getInputStream() != null) { byte[] buffer = new byte[1024]; int len = -1; while ((len = file.getInputStream().read(buffer)) != -1) { outStream.write(buffer, 0, len); } file.getInputStream().close(); } else { outStream.write(file.getFileData(), 0, file.getFileData().length); } outStream.write("'\r\n".getBytes()); } byte[] end_data = ("--" + BOUNDARY + "--\r\n").getBytes();// 数据结束标志 outStream.write(end_data); outStream.flush(); int cah = conn.getResponseCode(); if (cah != 200) throw new RuntimeException("请求URL失败"); InputStream in = conn.getInputStream(); int ch; StringBuilder b = new StringBuilder(); while ((ch = in.read()) != -1) { b.append((char) ch); } outStream.close(); conn.disconnect(); return b.toString(); } catch (Exception e) { // TODO Auto-generated catch block throw new RuntimeException(e); } } /** * 发送请求 * * @param actionUrl * 上传路径(注:避免使用localhost或者127.0.0.1这样的路径测试,它会指向手机模拟器,可以使用http:// * 192.168.1.10:8080测试) * @param params * key为参数名,value为参数值 * @param encode * 请求参数的编码 * @return */ public static byte[] post(String path, Map<String, String> params, String encode) throws Exception { StringBuilder paramBuilder = new StringBuilder(""); if (params != null && !params.isEmpty()) { for (Map.Entry<String, String> entry : params.entrySet()) { paramBuilder.append(entry.getKey()).append("=") .append(URLEncoder.encode(entry.getValue(), encode)) .append("&"); } paramBuilder.deleteCharAt(paramBuilder.length() - 1); } byte[] data = paramBuilder.toString().getBytes(); URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setUseCaches(false);// 不进行缓存 conn.setConnectTimeout(5 * 1000); conn.setRequestMethod("POST"); // 下面设置http请求头 conn.setRequestProperty( "Accept", "image/gif,image/jpeg,image/pjpeg,application/x-shockwave-flash,application/xaml-xml,application/vnd.ms-xpsdocument,application/x-ms-application,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/*"); conn.setRequestProperty( "User-Agent", "Mozilla/4.0(compatible;MSIE 8.0;Windows NT 5.2;Trident/4.0;.NET CLR 1.1.4322;.NET CLR 2.0.50722;.NET CLR 3.0.04506.30;.NET CLR 3.0.4506.2152;.NET CLR 3.5.30729)"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencode"); conn.setRequestProperty("Content-Length", String.valueOf(data.length)); conn.setRequestProperty("Connection", "Keep-Alive"); DataOutputStream outStream = new DataOutputStream( conn.getOutputStream()); outStream.write(data);// 把参数发送过去 outStream.flush(); outStream.close(); if (conn.getResponseCode() == 200) { return StreamTool.readInputStream(conn.getInputStream()); } return null; } }
相关文章推荐
- 一个简单地应用--从客户端向服务器发送数据.post,get.httpclientget,httpclinetpost,文件上传.
- Multipart/form-data POST文件上传详解 理论 简单的HTTP POST 大家通过HTTP向服务器发送POST请求提交数据,都是通过form表单提交的,代码如下: <form me
- 通过Android 客户端上传数据到服务器
- 【Android】Android客户端使用okhttp上传文件php服务器
- android客户端与php服务器的json数据简单交互(二)
- C#上传(修改表单数据),下载文件到服务器
- Android上传文件,客户端+服务器源码
- android手机客户端上传文件,java servlet服务器端接收并保存到服务器
- 现在很多的手机应用,都可能会直接嵌入一个web页面。这样做的好处:一个是功能更新方便,维护起来容易,只需要维护服务器的页面即可,不需要更新客户端;另一个是功能通用,不仅Android可以用,iOS也可
- Servlet 通过表单上传文件和获取表单数据的最简单方式
- Android客户端使用HttpURLConnection doGet与服务器数据交互简单示例
- android上传大文件到服务器客户端和服务器端代码
- 用Java实现简单的文件上传服务器和客户端
- android客户端与php服务器的json数据简单交互(一)
- 一个简单的可以接收TCP客户端数据的TCP服务器
- TCP数据传输(四):上传文件操作(将客户端的文件发送到服务器)
- 通过Android 客户端上传数据到服务器
- 通过Android 客户端上传数据到服务器
- 如何利用Axis2+Spring实现文件上传(支持jsp页面的form表单提交),Android客户端调用
- jQuery ajax 如何将文件与所有的表单数据上传到 ASP.NET服务器