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());
}
}
});
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。