
本文实例讲述了AndroID基于http协议实现文件上传功能的方法。分享给大家供大家参考,具体如下:
注意一般使用http协议上传的文件都比较小,一般是小于2M
这里示例是上传一个小的MP3文件
1.主Activity:MainActivity.java
public class MainActivity extends Activity{ private static final String TAG = "MainActivity"; private EditText timelengthText; private EditText TitleText; private EditText vIDeoText; @OverrIDe public voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.main); //提交上传按钮 button button = (button) this.findVIEwByID(R.ID.button); timelengthText = (EditText) this.findVIEwByID(R.ID.timelength); vIDeoText = (EditText) this.findVIEwByID(R.ID.vIDeo); TitleText = (EditText) this.findVIEwByID(R.ID.Title); button.setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { String Title = TitleText.getText().toString(); String timelength = timelengthText.getText().toString(); Map<String,String> params = new HashMap<String,String>(); params.put("method","save"); params.put("Title",Title); params.put("timelength",timelength); try { //得到SDCard的目录 file uploadfile = new file(Environment.getExternalStorageDirectory(),vIDeoText.getText().toString()); //上传音频文件 Formfile formfile = new Formfile("02.mp3",uploadfile,"vIDeo","audio/mpeg"); SockethttpRequester.post("http://192.168.1.100:8080/vIDeoweb/vIDeo/manage.do",params,formfile); Toast.makeText(MainActivity.this,R.string.success,1).show(); } catch (Exception e) { Toast.makeText(MainActivity.this,R.string.error,1).show(); Log.e(TAG,e.toString()); } } }); }}2.上传工具类,注意里面构造协议字符串需要根据不同的提交表单来处理
public class SockethttpRequester{ /** * 发送xml数据 * @param path 请求地址 * @param xml xml数据 * @param enCoding 编码 * @return * @throws Exception */ public static byte[] postXml(String path,String xml,String enCoding) throws Exception{ byte[] data = xml.getBytes(enCoding); URL url = new URL(path); httpURLConnection conn = (httpURLConnection)url.openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); conn.setRequestProperty("Content-Type","text/xml; charset="+ enCoding); conn.setRequestProperty("Content-Length",String.valueOf(data.length)); conn.setConnectTimeout(5 * 1000); OutputStream outStream = conn.getoutputStream(); outStream.write(data); outStream.flush(); outStream.close(); if(conn.getResponseCode()==200){ return readStream(conn.getinputStream()); } return null; } /** * 直接通过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 path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试, * 因为它会指向手机模拟器,你可以使用http://www.baIDu.com或http://192.168.1.10:8080这样的路径测试) * @param params 请求参数 key为参数名,value为参数值 * @param file 上传文件 */ public static boolean post(String path,Map<String,String> params,Formfile[] files) throws Exception { //数据分隔线 final String BOUNDARY = "---------------------------7da2137580612"; //数据结束标志"---------------------------7da2137580612--" final String endline = "--" + BOUNDARY + "--/r/n"; //下面两个for循环都是为了得到数据长度参数,依据表单的类型而定 //首先得到文件类型数据的总长度(包括文件分割线) int fileDataLength = 0; for(Formfile uploadfile : files) { StringBuilder fileExplain = new StringBuilder(); fileExplain.append("--"); fileExplain.append(BOUNDARY); fileExplain.append("/r/n"); fileExplain.append("Content-disposition: form-data;name=/""+ uploadfile.getParametername()+"/";filename=/""+ uploadfile.getFilname() + "/"/r/n"); fileExplain.append("Content-Type: "+ uploadfile.getContentType()+"/r/n/r/n"); fileExplain.append("/r/n"); fileDataLength += fileExplain.length(); if(uploadfile.getInStream()!=null){ fileDataLength += uploadfile.getfile().length(); }else{ fileDataLength += uploadfile.getData().length; } } //再构造文本类型参数的实体数据 StringBuilder textEntity = new StringBuilder(); for (Map.Entry<String,String> entry : params.entrySet()) { textEntity.append("--"); textEntity.append(BOUNDARY); textEntity.append("/r/n"); textEntity.append("Content-disposition: form-data; name=/""+ entry.getKey() + "/"/r/n/r/n"); textEntity.append(entry.getValue()); textEntity.append("/r/n"); } //计算传输给服务器的实体数据总长度(文本总长度+数据总长度+分隔符) int dataLength = textEntity.toString().getBytes().length + fileDataLength + endline.getBytes().length; URL url = new URL(path); //默认端口号其实可以不写 int port = url.getPort()==-1 ? 80 : url.getPort(); //建立一个Socket链接 Socket socket = new Socket(InetAddress.getByname(url.getHost()),port); //获得一个输出流(从AndroID流到web) OutputStream outStream = socket.getoutputStream(); //下面完成http请求头的发送 String requestmethod = "POST "+ url.getPath()+" http/1.1/r/n"; outStream.write(requestmethod.getBytes()); //构建accept String accept = "Accept: image/gif,image/jpeg,image/pjpeg,application/x-shockwave-flash,application/xaml+xml,application/vnd.ms-xpsdocument,application/x-ms-xbap,application/x-ms-application,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/*/r/n"; outStream.write(accept.getBytes()); //构建language String language = "Accept-Language: zh-CN/r/n"; outStream.write(language.getBytes()); //构建ContentType String ContentType = "Content-Type: multipart/form-data; boundary="+ BOUNDARY+ "/r/n"; outStream.write(ContentType.getBytes()); //构建contentlength String contentlength = "Content-Length: "+ dataLength + "/r/n"; outStream.write(contentlength.getBytes()); //构建alive String alive = "Connection: Keep-Alive/r/n"; outStream.write(alive.getBytes()); //构建host String host = "Host: "+ url.getHost() +":"+ port +"/r/n"; outStream.write(host.getBytes()); //写完http请求头后根据http协议再写一个回车换行 outStream.write("/r/n".getBytes()); //把所有文本类型的实体数据发送出来 outStream.write(textEntity.toString().getBytes()); //把所有文件类型的实体数据发送出来 for(Formfile uploadfile : files) { StringBuilder fileEntity = new StringBuilder(); fileEntity.append("--"); fileEntity.append(BOUNDARY); fileEntity.append("/r/n"); fileEntity.append("Content-disposition: form-data;name=/""+ uploadfile.getParametername()+"/";filename=/""+ uploadfile.getFilname() + "/"/r/n"); fileEntity.append("Content-Type: "+ uploadfile.getContentType()+"/r/n/r/n"); outStream.write(fileEntity.toString().getBytes()); //边读边写 if(uploadfile.getInStream()!=null) { byte[] buffer = new byte[1024]; int len = 0; while((len = uploadfile.getInStream().read(buffer,1024))!=-1) { outStream.write(buffer,len); } uploadfile.getInStream().close(); } else { outStream.write(uploadfile.getData(),uploadfile.getData().length); } outStream.write("/r/n".getBytes()); } //下面发送数据结束标志,表示数据已经结束 outStream.write(endline.getBytes()); BufferedReader reader = new BufferedReader(new inputStreamReader(socket.getinputStream())); //读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败 if(reader.readline().indexOf("200")==-1) { return false; } outStream.flush(); outStream.close(); reader.close(); socket.close(); return true; } /** * 提交数据到服务器 * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.baIDu.com或http://192.168.1.10:8080这样的路径测试) * @param params 请求参数 key为参数名,Formfile file) throws Exception { return post(path,new Formfile[]{file}); } /** * 提交数据到服务器 * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.baIDu.com或http://192.168.1.10:8080这样的路径测试) * @param params 请求参数 key为参数名,value为参数值 * @param encode 编码 */ public static byte[] postFromhttpClIEnt(String path,String encode) throws Exception { //用于存放请求参数 List<nameValuePair> formparams = new ArrayList<nameValuePair>(); for(Map.Entry<String,String> entry : params.entrySet()) { formparams.add(new BasicnameValuePair(entry.getKey(),entry.getValue())); } UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams,encode); httpPost httppost = new httpPost(path); httppost.setEntity(entity); //看作是浏览器 httpClIEnt httpclIEnt = new DefaulthttpClIEnt(); //发送post请求 httpResponse response = httpclIEnt.execute(httppost); return readStream(response.getEntity().getContent()); } /** * 发送请求 * @param path 请求路径 * @param params 请求参数 key为参数名称 value为参数值 * @param encode 请求参数的编码 */ public static byte[] post(String path,String encode) throws Exception { //String params = "method=save&name="+ URLEncoder.encode("老毕","UTF-8")+ "&age=28&";//需要发送的参数 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,*/*"); conn.setRequestProperty("Accept-Language","zh-CN"); 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.50727; .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-urlencoded"); 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 readStream(conn.getinputStream()); } return null; } /** * 读取流 * @param inStream * @return 字节数组 * @throws Exception */ public static byte[] readStream(inputStream inStream) throws Exception { ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = -1; while( (len=inStream.read(buffer)) != -1) { outSteam.write(buffer,len); } outSteam.close(); inStream.close(); return outSteam.toByteArray(); }}public class StreamTool{ /** * 从输入流读取数据 * @param inStream * @return * @throws Exception */ public static byte[] readinputStream(inputStream inStream) throws Exception{ ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while( (len = inStream.read(buffer)) !=-1 ){ outSteam.write(buffer,len); } outSteam.close(); inStream.close(); return outSteam.toByteArray(); }}/** * 使用JavaBean封装上传文件数据 * */public class Formfile{ //上传文件的数据 private byte[] data; private inputStream inStream; private file file; //文件名称 private String filname; //请求参数名称 private String parametername; //内容类型 private String ContentType = "application/octet-stream"; /** * 上传小文件,把文件数据先读入内存 * @param filname * @param data * @param parametername * @param ContentType */ public Formfile(String filname,byte[] data,String parametername,String ContentType) { this.data = data; this.filname = filname; this.parametername = parametername; if(ContentType!=null) this.ContentType = ContentType; } /** * 上传大文件,一边读文件数据一边上传 * @param filname * @param file * @param parametername * @param ContentType */ public Formfile(String filname,file file,String ContentType) { this.filname = filname; this.parametername = parametername; this.file = file; try { this.inStream = new fileinputStream(file); } catch (fileNotFoundException e) { e.printstacktrace(); } if(ContentType!=null) this.ContentType = ContentType; } public file getfile() { return file; } public inputStream getInStream() { return inStream; } public byte[] getData() { return data; } public String getFilname() { return filname; } public voID setFilname(String filname) { this.filname = filname; } public String getParametername() { return parametername; } public voID setParametername(String parametername) { this.parametername = parametername; } public String getContentType() { return ContentType; } public voID setContentType(String ContentType) { this.ContentType = ContentType; }}更多关于AndroID相关内容感兴趣的读者可查看本站专题:《Android文件 *** 作技巧汇总》、《Android *** 作SQLite数据库技巧总结》、《Android *** 作json格式数据技巧总结》、《Android数据库 *** 作技巧总结》、《Android编程之activity *** 作技巧总结》、《Android编程开发之SD卡 *** 作方法汇总》、《Android开发入门与进阶教程》、《Android资源 *** 作技巧汇总》、《Android视图View技巧总结》及《Android控件用法总结》
希望本文所述对大家AndroID程序设计有所帮助。
总结以上是内存溢出为你收集整理的Android基于Http协议实现文件上传功能的方法全部内容,希望文章能够帮你解决Android基于Http协议实现文件上传功能的方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)