1. android端代碼
public interface GetData {
@POST("upload")
Observable<String> upload(@Body RequestBody Body);
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://10.0.3.28:8080/")
GetData request = retrofit.create(GetData.class);
File file = new File(path);
//構(gòu)建body
//addFormDataPart()第一個(gè)參數(shù)為表單名字筑累,這是和后臺(tái)約定好的
MultipartBody.Builder builder = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("username", "name")
.addFormDataPart("phone", "phone");
//注意,file是后臺(tái)約定的參數(shù)丝蹭,如果是多圖慢宗,file[],如果是單張圖片奔穿,file就行
for (int i=0;i<3;i++) {
//這里上傳的是多圖
builder.addFormDataPart("files", file.getName(), RequestBody.create(MediaType.parse("image/*"), file));
}
RequestBody requestBody = builder.build();
Observable<String> observable = request.upload(requestBody);
observable
.subscribeOn(Schedulers.io()) //在IO線程進(jìn)行網(wǎng)絡(luò)請(qǐng)求
.observeOn(AndroidSchedulers.mainThread())//回到主線程處理請(qǐng)求結(jié)果
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Log.d("lsm", "Throwable == " + e.toString());
}
@Override
public void onNext(String s) {
Log.d("lsm", "result == " + s);
}
});
2. Go語(yǔ)言后端代碼
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.POST("/upload", func(c *gin.Context) {
// Multipart form
form, e1 := c.MultipartForm()
if e1!=nil {
fmt.Println(e1)
}
usernames := form.Value["username"] //數(shù)據(jù)切片
fmt.Printf("username == %s\n",usernames[0])
files := form.File["files"] //文件切片
for a, file := range files {
fmt.Println(file.Filename)
fmt.Printf("a == %d\n",a)
// 上傳文件至指定目錄
c.SaveUploadedFile(file, "F:/image/"+file.Filename)
}
c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files)))
})
r.Run(":8080") // 監(jiān)聽(tīng)并在 :8080 上啟動(dòng)服務(wù)