Golang+Android基于HttpURLConnection实现的文件上传功能示例
本文实例讲述了Golang+Android基于HttpURLConnection实现的文件上传功能。分享给大家供大家参考,具体如下:
这里要演示的是使用Android程序作为客户端(使用HttpURLConnection访问网络),Golang程序作为服务器端,实现文件上传。
客户端代码:
publicstaticStringuploadFile(StringuploadUrl,StringfilePath){
Log.v(TAG,"url:"+uploadUrl);
Log.v(TAG,"filePath:"+filePath);
StringnextLine="\r\n";
StringdividerStart="--";
Stringboundary="******";
try{
URLurl=newURL(uploadUrl);
HttpURLConnectionconnection=(HttpURLConnection)url.openConnection();
connection.setChunkedStreamingMode(1024*256);
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestMethod("POST");
//设置Http请求头
connection.setRequestProperty("Connection","Keep-Alive");
connection.setRequestProperty("Charset","UTF-8");
//必须在Content-Type请求头中指定分界符
connection.setRequestProperty("Content-Type","multipart/form-data;boundary="+boundary);
//定义数据写入流,准备上传文件
DataOutputStreamdos=newDataOutputStream(connection.getOutputStream());
dos.writeBytes(dividerStart+boundary+nextLine);
//设置与上传文件相关的信息
dos.writeBytes("Content-Disposition:form-data;name=\"file\";filename=\""
+filePath.substring(filePath.lastIndexOf("/")+1)+"\""+nextLine);
dos.writeBytes(nextLine);
FileInputStreamfis=newFileInputStream(filePath);
byte[]buffer=newbyte[1024*32];
intcount;
//读取文件内容,并写入OutputStream对象
while((count=fis.read(buffer))!=-1){
dos.write(buffer,0,count);
}
fis.close();
dos.writeBytes(nextLine);
dos.writeBytes(dividerStart+boundary+dividerStart+nextLine);
dos.flush();
//开始读取从服务器传过来的信息
InputStreamis=connection.getInputStream();
BufferedReaderbr=newBufferedReader(newInputStreamReader(is,"UTF-8"));
Stringresult=br.readLine();
dos.close();
is.close();
connection.disconnect();
returnresult;
}catch(IOExceptione){
e.printStackTrace();
}
returnnull;
}
服务器端代码:
packagewebserver
//接收客户端通过http上传的文件
//Date:2015-3-2516:18:33
import(
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
)
funcUpLoadBase(){
fmt.Println("Thisisuploadbase")
http.HandleFunc("/httpUploadFile",handleUploadFile)
http.ListenAndServe(":8086",nil)
iferr!=nil{
fmt.Println("ListenAndServeerror:",err.Error())
}
}
funchandleUploadFile(whttp.ResponseWriter,r*http.Request){
fmt.Println("client:",r.RemoteAddr)
file,fileHeader,err:=r.FormFile("file")
iferr!=nil{
log.Fatal("FormFile:",err.Error())
return
}
deferfunc(){
iferr:=file.Close();err!=nil{
log.Fatal("Close:",err.Error())
return
}
}()
//文件名
fileName:=fileHeader.Filename
iffileName==""{
log.Fatal("Paramfilenamecannotbenull.")
return
}
//文件内容
bytes,err:=ioutil.ReadAll(file)
//写到服务端本地文件中
outputFilePath:="/home/admin/桌面/"+fileName
err=ioutil.WriteFile(outputFilePath,bytes,os.ModePerm)
iferr!=nil{
log.Fatal("WriteFileError:",err.Error())
return
}
w.Write(([]byte)("上传文件成功!"))
}
希望本文所述对大家Android程序设计有所帮助。