Golang+Android基于HttpURLConnection实现的文件上传功能示例
本文实例讲述了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;
}
服务器端代码:
//接收客户端通过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相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。
相关文章
AndroidSDK Support自带夜间、日间模式切换详解
这篇文章主要为大家详细介绍了AndroidSDK Support自带夜间、日间模式切换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2016-09-09
Android开发之利用Activity实现Dialog对话框
这篇文章主要给大家介绍了Android开发之如何利用Activity实现Dialog对话框效果,文中给出了详细的示例代码,相信对大家的理解及学习具有一定的参考借鉴价值,有需要的朋友们下面来一起看看吧。2016-12-12
Android 使用Picasso加载网络图片等比例缩放的实现方法
在做android图片加载的时候,由于手机屏幕受限,很多大图加载过来的时候,我们要求等比例缩放,接下来小编给大家带来了Android 使用Picasso加载网络图片等比例缩放的实现方法,感兴趣的朋友一起看看吧2018-08-08
Android中二维码的生成方法(普通二维码、中心Logo 二维码、及扫描解析二维码)
这篇文章主要介绍了Android中二维码的生成方法(普通二维码、中心Logo 二维码、及扫描解析二维码),需要的朋友可以参考下2017-02-02
浅谈Android RecyclerView UI的滚动控件示例
本篇文章主要介绍了浅谈Android RecyclerView UI的滚动控件示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-02-02
百度地图API提示230 错误app scode码校验失败的解决办法
笔者近2天在 Android Studio上玩了一下百度地图,碰到了常见的"230错误 APP Scode校验失败",下面我来介绍一下具体的解决办法2016-01-01


最新评论