本文实例讲述了Golang+Android基于HttpURLConnection实现的文件上传功能。分享给大家供大家参考,具体如下:
这里要演示的是使用Android程序作为客户端(使用HttpURLConnection访问网络),Golang程序作为服务器端,实现文件上传。
客户端代码:
public static String uploadFile(String uploadUrl, String filePath) { Log.v(TAG, "url:" + uploadUrl); Log.v(TAG, "filePath:" + filePath); String nextLine = "\r\n"; String dividerStart = "--"; String boundary = "******"; try { URL url = new URL(uploadUrl); HttpURLConnection connection = (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); //定义数据写入流,准备上传文件 DataOutputStream dos = new DataOutputStream(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); FileInputStream fis = new FileInputStream(filePath); byte[] buffer = new byte[1024 * 32]; int count; // 读取文件内容,并写入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(); // 开始读取从服务器传过来的信息 InputStream is = connection.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8")); String result = br.readLine(); dos.close(); is.close(); connection.disconnect(); return result; } catch (IOException e) { e.printStackTrace(); } return null; }
服务器端代码:
package webserver //接收客户端通过http上传的文件 //Date: 2015-3-25 16:18:33 import ( "fmt" "io/ioutil" "log" "net/http" "os" ) func UpLoadBase() { fmt.Println("This is uploadbase") http.HandleFunc("/httpUploadFile", handleUploadFile) http.ListenAndServe(":8086", nil) if err != nil { fmt.Println("ListenAndServe error: ", err.Error()) } } func handleUploadFile(w http.ResponseWriter, r *http.Request) { fmt.Println("client:", r.RemoteAddr) file, fileHeader, err := r.FormFile("file") if err != nil { log.Fatal("FormFile:", err.Error()) return } defer func() { if err := file.Close(); err != nil { log.Fatal("Close:", err.Error()) return } }() //文件名 fileName := fileHeader.Filename if fileName == "" { log.Fatal("Param filename cannot be null.") return } //文件内容 bytes, err := ioutil.ReadAll(file) //写到服务端本地文件中 outputFilePath := "/home/admin/桌面/" + fileName err = ioutil.WriteFile(outputFilePath, bytes, os.ModePerm) if err != nil { log.Fatal("WriteFileError:", err.Error()) return } w.Write(([]byte)("上传文件成功!")) }
希望本文所述对大家Android程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。