[ http请求上传文件[golang] ]


基础上传文件

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))
}