Android通过HTTP协议实现上传文件数据
本文实例为大家分享了Android通过HTTP协议实现上传文件数据的具体代码,供大家参考,具体内容如下
SocketHttpRequester.java
packagecn.itcast.utils; importjava.io.BufferedReader; importjava.io.ByteArrayOutputStream; importjava.io.DataOutputStream; importjava.io.InputStream; importjava.io.InputStreamReader; importjava.io.OutputStream; importjava.net.HttpURLConnection; importjava.net.InetAddress; importjava.net.Socket; importjava.net.URL; importjava.net.URLEncoder; importjava.util.ArrayList; importjava.util.List; importjava.util.Map; importorg.apache.http.HttpResponse; importorg.apache.http.NameValuePair; importorg.apache.http.client.HttpClient; importorg.apache.http.client.entity.UrlEncodedFormEntity; importorg.apache.http.client.methods.HttpPost; importorg.apache.http.impl.client.DefaultHttpClient; importorg.apache.http.message.BasicNameValuePair; publicclassSocketHttpRequester{ /** *发送xml数据 *@parampath请求地址 *@paramxmlxml数据 *@paramencoding编码 *@return *@throwsException */ publicstaticbyte[]postXml(Stringpath,Stringxml,Stringencoding)throwsException{ byte[]data=xml.getBytes(encoding); URLurl=newURL(path); HttpURLConnectionconn=(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); OutputStreamoutStream=conn.getOutputStream(); outStream.write(data); outStream.flush(); outStream.close(); if(conn.getResponseCode()==200){ returnreadStream(conn.getInputStream()); } returnnull; } /** *直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能: *<FORMMETHOD=POSTACTION="http://192.168.0.200:8080/ssi/fileload/test.do"enctype="multipart/form-data"> <INPUTTYPE="text"NAME="name"> <INPUTTYPE="text"NAME="id"> <inputtype="file"name="imagefile"/> <inputtype="file"name="zip"/> </FORM> *@parampath上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试) *@paramparams请求参数key为参数名,value为参数值 *@paramfile上传文件 */ publicstaticbooleanpost(Stringpath,Map<String,String>params,FormFile[]files)throwsException{ finalStringBOUNDARY="---------------------------7da2137580612";//数据分隔线 finalStringendline="--"+BOUNDARY+"--\r\n";//数据结束标志 intfileDataLength=0; for(FormFileuploadFile:files){//得到文件类型数据的总长度 StringBuilderfileExplain=newStringBuilder(); 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; } } StringBuildertextEntity=newStringBuilder(); 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"); } //计算传输给服务器的实体数据总长度 intdataLength=textEntity.toString().getBytes().length+fileDataLength+endline.getBytes().length; URLurl=newURL(path); intport=url.getPort()==-1?80:url.getPort(); Socketsocket=newSocket(InetAddress.getByName(url.getHost()),port); OutputStreamoutStream=socket.getOutputStream(); //下面完成HTTP请求头的发送 Stringrequestmethod="POST"+url.getPath()+"HTTP/1.1\r\n"; outStream.write(requestmethod.getBytes()); Stringaccept="Accept:image/gif,image/jpeg,image/pjpeg,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()); Stringlanguage="Accept-Language:zh-CN\r\n"; outStream.write(language.getBytes()); Stringcontenttype="Content-Type:multipart/form-data;boundary="+BOUNDARY+"\r\n"; outStream.write(contenttype.getBytes()); Stringcontentlength="Content-Length:"+dataLength+"\r\n"; outStream.write(contentlength.getBytes()); Stringalive="Connection:Keep-Alive\r\n"; outStream.write(alive.getBytes()); Stringhost="Host:"+url.getHost()+":"+port+"\r\n"; outStream.write(host.getBytes()); //写完HTTP请求头后根据HTTP协议再写一个回车换行 outStream.write("\r\n".getBytes()); //把所有文本类型的实体数据发送出来 outStream.write(textEntity.toString().getBytes()); //把所有文件类型的实体数据发送出来 for(FormFileuploadFile:files){ StringBuilderfileEntity=newStringBuilder(); 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=newbyte[1024]; intlen=0; while((len=uploadFile.getInStream().read(buffer,0,1024))!=-1){ outStream.write(buffer,0,len); } uploadFile.getInStream().close(); }else{ outStream.write(uploadFile.getData(),0,uploadFile.getData().length); } outStream.write("\r\n".getBytes()); } //下面发送数据结束标志,表示数据已经结束 outStream.write(endline.getBytes()); BufferedReaderreader=newBufferedReader(newInputStreamReader(socket.getInputStream())); if(reader.readLine().indexOf("200")==-1){//读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败 returnfalse; } outStream.flush(); outStream.close(); reader.close(); socket.close(); returntrue; } /** *提交数据到服务器 *@parampath上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试) *@paramparams请求参数key为参数名,value为参数值 *@paramfile上传文件 */ publicstaticbooleanpost(Stringpath,Map<String,String>params,FormFilefile)throwsException{ returnpost(path,params,newFormFile[]{file}); } /** *提交数据到服务器 *@parampath上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试) *@paramparams请求参数key为参数名,value为参数值 *@paramencode编码 */ publicstaticbyte[]postFromHttpClient(Stringpath,Map<String,String>params,Stringencode)throwsException{ List<NameValuePair>formparams=newArrayList<NameValuePair>();//用于存放请求参数 for(Map.Entry<String,String>entry:params.entrySet()){ formparams.add(newBasicNameValuePair(entry.getKey(),entry.getValue())); } UrlEncodedFormEntityentity=newUrlEncodedFormEntity(formparams,encode); HttpPosthttppost=newHttpPost(path); httppost.setEntity(entity); HttpClienthttpclient=newDefaultHttpClient();//看作是浏览器 HttpResponseresponse=httpclient.execute(httppost);//发送post请求 returnreadStream(response.getEntity().getContent()); } /** *发送请求 *@parampath请求路径 *@paramparams请求参数key为参数名称value为参数值 *@paramencode请求参数的编码 */ publicstaticbyte[]post(Stringpath,Map<String,String>params,Stringencode)throwsException{ //Stringparams="method=save&name="+URLEncoder.encode("老毕","UTF-8")+"&age=28&";//需要发送的参数 StringBuilderparambuilder=newStringBuilder(""); 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(); URLurl=newURL(path); HttpURLConnectionconn=(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,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,*/*"); conn.setRequestProperty("Accept-Language","zh-CN"); conn.setRequestProperty("User-Agent","Mozilla/4.0(compatible;MSIE8.0;WindowsNT5.2;Trident/4.0;.NETCLR1.1.4322;.NETCLR2.0.50727;.NETCLR3.0.04506.30;.NETCLR3.0.4506.2152;.NETCLR3.5.30729)"); conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Length",String.valueOf(data.length)); conn.setRequestProperty("Connection","Keep-Alive"); //发送参数 DataOutputStreamoutStream=newDataOutputStream(conn.getOutputStream()); outStream.write(data);//把参数发送出去 outStream.flush(); outStream.close(); if(conn.getResponseCode()==200){ returnreadStream(conn.getInputStream()); } returnnull; } /** *读取流 *@paraminStream *@return字节数组 *@throwsException */ publicstaticbyte[]readStream(InputStreaminStream)throwsException{ ByteArrayOutputStreamoutSteam=newByteArrayOutputStream(); byte[]buffer=newbyte[1024]; intlen=-1; while((len=inStream.read(buffer))!=-1){ outSteam.write(buffer,0,len); } outSteam.close(); inStream.close(); returnoutSteam.toByteArray(); } }
FormFile.java
packagecn.itcast.utils; importjava.io.File; importjava.io.FileInputStream; importjava.io.FileNotFoundException; importjava.io.InputStream; /** *上传文件 */ publicclassFormFile{ /*上传文件的数据*/ privatebyte[]data; privateInputStreaminStream; privateFilefile; /*文件名称*/ privateStringfilname; /*请求参数名称*/ privateStringparameterName; /*内容类型*/ privateStringcontentType="application/octet-stream"; publicFormFile(Stringfilname,byte[]data,StringparameterName,StringcontentType){ this.data=data; this.filname=filname; this.parameterName=parameterName; if(contentType!=null)this.contentType=contentType; } publicFormFile(Stringfilname,Filefile,StringparameterName,StringcontentType){ this.filname=filname; this.parameterName=parameterName; this.file=file; try{ this.inStream=newFileInputStream(file); }catch(FileNotFoundExceptione){ e.printStackTrace(); } if(contentType!=null)this.contentType=contentType; } publicFilegetFile(){ returnfile; } publicInputStreamgetInStream(){ returninStream; } publicbyte[]getData(){ returndata; } publicStringgetFilname(){ returnfilname; } publicvoidsetFilname(Stringfilname){ this.filname=filname; } publicStringgetParameterName(){ returnparameterName; } publicvoidsetParameterName(StringparameterName){ this.parameterName=parameterName; } publicStringgetContentType(){ returncontentType; } publicvoidsetContentType(StringcontentType){ this.contentType=contentType; } }
StreamTool.java
packagecn.itcast.utils; importjava.io.ByteArrayOutputStream; importjava.io.InputStream; publicclassStreamTool{ /** *从输入流读取数据 *@paraminStream *@return *@throwsException */ publicstaticbyte[]readInputStream(InputStreaminStream)throwsException{ ByteArrayOutputStreamoutSteam=newByteArrayOutputStream(); byte[]buffer=newbyte[1024]; intlen=0; while((len=inStream.read(buffer))!=-1){ outSteam.write(buffer,0,len); } outSteam.close(); inStream.close(); returnoutSteam.toByteArray(); } }
MainActivity.java
packagecn.itcast.uploaddata; importjava.io.File; importjava.util.HashMap; importjava.util.Map; importcn.itcast.net.HttpRequest; importcn.itcast.utils.FormFile; importcn.itcast.utils.SocketHttpRequester; importandroid.app.Activity; importandroid.os.Bundle; importandroid.os.Environment; importandroid.util.Log; importandroid.view.View; importandroid.widget.Button; importandroid.widget.EditText; importandroid.widget.Toast; publicclassMainActivityextendsActivity{ privatestaticfinalStringTAG="MainActivity"; privateEditTexttimelengthText; privateEditTexttitleText; privateEditTextvideoText; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); Buttonbutton=(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(newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ Stringtitle=titleText.getText().toString(); Stringtimelength=timelengthText.getText().toString(); Map<String,String>params=newHashMap<String,String>(); params.put("method","save"); params.put("title",title); params.put("timelength",timelength); try{ //HttpRequest.sendGetRequest("http://192.168.1.100:8080/videoweb/video/manage.do",params,"UTF-8"); FileuploadFile=newFile(Environment.getExternalStorageDirectory(),videoText.getText().toString()); FormFileformfile=newFormFile("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(Exceptione){ Toast.makeText(MainActivity.this,R.string.error,1).show(); Log.e(TAG,e.toString()); } } }); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。