Go图片上传

##一、描述 此文章介绍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错误

转载于:https://juejin.im/post/5b3aca29f265da62e060a239

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值