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:33import ("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.Filenameif fileName == "" {log.Fatal("Param filename cannot be null.")return}//檔案內容bytes, err := ioutil.ReadAll(file)//寫到服務端本地檔案中outputFilePath := "/home/admin/案頭/" + fileNameerr = ioutil.WriteFile(outputFilePath, bytes, os.ModePerm)if err != nil {log.Fatal("WriteFileError:", err.Error())return}w.Write(([]byte)("上傳檔案成功!"))}