基础上传文件
func TestGoFastDfsClient(t *testing.T) {
url := "/group1/upload"
filename := "2.png"
// 1. form表单请求体:头部
bodyBuf := bytes.NewBufferString("")
bodyWrite := multipart.NewWriter(bodyBuf)
_, err := bodyWrite.CreateFormFile("file", filename)
if err != nil {
fmt.Println("创建上传数据错误")
panic(err)
}
fmt.Println(bodyBuf)
// 2. form请求体:内容文件
fh, err := os.Open(filename)
if err != nil {
fmt.Println("打开文件错误")
panic(err.Error())
}
defer fh.Close()
// 3. form请求体:尾部
boundary := bodyWrite.Boundary() // 获取文件开始与结束的字符
close_buf := bytes.NewBufferString(fmt.Sprintf("\r\n--%s--\r\n", boundary))
fmt.Println(boundary)
// 合并1.2.3生成form请求体
request_render := io.MultiReader(bodyBuf, fh, close_buf)
// 获取文件信息
fi, err := fh.Stat()
if err != nil {
fmt.Println("获取文件信息失败")
panic(err)
}
httpReq, err := http.NewRequest(http.MethodPost, url, request_render)
if err != nil {
fmt.Println("创建请求错误")
panic(err.Error())
}
// 配置params参数
query := httpReq.URL.Query()
query.Add("output", "json")
query.Add("scene", "")
query.Add("path", "")
httpReq.URL.RawQuery = query.Encode()
// 设置form文件上传请求头
httpReq.Header.Add("Content-Type", "multipart/form-data; boundary="+boundary)
httpReq.ContentLength = fi.Size() + int64(bodyBuf.Len()) + int64(close_buf.Len())
// 发送请求
httpRes, err := http.DefaultClient.Do(httpReq)
if err != nil {
fmt.Println("发送请求失败")
panic(err)
}
defer httpRes.Body.Close()
resBody, err := io.ReadAll(httpRes.Body)
if err != nil {
fmt.Println("读取响应消息失败")
panic(err)
}
fmt.Println(string(resBody))
}