##一、描述
此文章介绍Go使用Android上传图片,服务端接收图片
##二、上传图片(单图片上传)
####客户端
第一步:创建对应的Retrofit的定义,MultipartBody进行上传
@Multipart
@POST("show")
Observable<String> uploadImage(@Part MultipartBody.Part file);
复制代码
第二步:准备文件,组装MultipartBody
//需要上传的图片
File file = new File(filePath);
//创建RequestBody
RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
//最后根据image这个key,服务端就根据这个key进行接受图片就好
MultipartBody.Part body = MultipartBody.Part.createFormData("image", file.getName(), requestBody);
Api.getInstance().getRetrofit(HttpService.class)
.uploadImage(body)
.......
复制代码
####服务端
a.ParseMultipartForm(128 << 20)
//根据客户端约定的key值,接受图片,file是图片本身,handler包含图片的文件名
file, handler, err := r.FormFile("image")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
//在此创建对应图片的文件,这时只是一个空的图片文件,真实图片需要下面Copy进去
f, err := os.OpenFile("./test/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
//最后复制进入
io.Copy(f, file)
复制代码
##三、上传图片(多图片上传)
####客户端
第一步:创建对应的Retrofit的定义,Map<String, RequestBody>进行上传
@Multipart
@POST("show")
Observable<String> uploadImage(@PartMap Map<String, RequestBody> params);
复制代码
第二步:准备文件,组装Map<String, RequestBody>
// 获取返回的图片列表
List<String> path = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);
// 处理你自己的逻辑 ....
Map<String, RequestBody> list = new HashMap<>();
for (int i = 0; i < path.size(); i++) {
String s = path.get(i);
File file = new File(s);
RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
//键就是MyImage1,2,3,4,5,6,服务端也要根据这个键来取出图片
list.put("MyImage" + i + "\"; filename=\"" + file.getName(), requestBody);
}
Api.getInstance().getRetrofit(HttpService.class)
复制代码
####服务端
//保存所有图片的方法
func saveImages(a *http.Request) {
a.ParseMultipartForm(128 << 20) //加入了这个,才不会报错
files := a.MultipartForm.File //获取上传的所有文件
for z := 0; z < len(files); z++ {
result := files["MyImage" + strconv.Itoa(z)] //根据客户端定义的键进行取出所有的图片
var filelist = make(map[int]MyFile) //创建一个集合文件对象
for i := 0; i < len(result); i++ {
//取出键中的值,生成新的文件对象,最后add进入集合
item := result[i]
fileItem := MyFile{}
fileItem.Name = item.Filename
fileItem.File, _ = item.Open()
filelist[i] = fileItem
}
//判断文件夹是否存在?不存在就创建文件夹以用于存放图片
_,err := os.Stat("./test")
if err != nil{
os.Mkdir("test",0666)
}
//遍历存储好的对象,然后打开文件夹,创建对应文件的图片文件,然后运用copy方法进行存储图片
for j := 0; j < len(filelist); j++ {
file := filelist[j].File
saveFile, _ := os.OpenFile("./test/" + filelist[j].Name,os.O_CREATE, 0666)
io.Copy(saveFile, file)
}
}
}
复制代码
##二、注意事项
1 使用了@Multipart注解,参数的类型都应该是RequestBody,不然上传的图片的时候会报JSON must start with an array or an object错误