• golang 上传图片 --chatGPT


    问:makeImgUpload(path string) 实现发送发送图片, 发送类型为 multipart/form-data
    gpt:

    下面是一个简单的 `makeImgUpload` 函数的实现,用于发送图片并以 `multipart/form-data` 格式进行上传。请注意,此代码假设图片文件路径是正确的,并且你应该替换其中的 `url` 和其他相关参数为你实际的目标。

    ```go
    package main

    import (
        "bytes"
        "fmt"
        "io"
        "mime/multipart"
        "net/http"
        "os"
    )

    func makeImgUpload(path string) error {
        // 服务器地址
        url := "https://example.com/upload"

        // 创建一个 buffer 用于存储 multipart 数据
        var buffer bytes.Buffer
        writer := multipart.NewWriter(&buffer)

        // 以给定的 boundary 创建一个 part
        part, err := writer.CreateFormFile("media", "blob")
        if err != nil {
            return err
        }

        // 打开图片文件
        file, err := os.Open(path)
        if err != nil {
            return err
        }
        defer file.Close()

        // 将图片文件复制到 part 中
        _, err = io.Copy(part, file)
        if err != nil {
            return err
        }

        // 写入额外的字段,如果有的话
        // writer.WriteField("key", "value")

        // 写入结束 boundary
        writer.Close()

        // 发送 POST 请求
        req, err := http.NewRequest("POST", url, &buffer)
        if err != nil {
            return err
        }

        // 设置 Content-Type 为 multipart/form-data,并添加 boundary
        req.Header.Set("Content-Type", writer.FormDataContentType())

        // 发送请求
        client := &http.Client{}
        resp, err := client.Do(req)
        if err != nil {
            return err
        }
        defer resp.Body.Close()

        // 处理响应
        // ...

        return nil
    }

    func main() {
        // 替换为你的图片路径
        imgPath := "/path/to/your/image.jpg"

        err := makeImgUpload(imgPath)
        if err != nil {
            fmt.Println("Error:", err)
        } else {
            fmt.Println("Upload successful!")
        }
    }
    ```

    这个例子中,`makeImgUpload` 函数将指定的图片文件上传到服务器。请确保替换 `url` 和其他请求参数为实际值。函数使用 `multipart` 包来构建 `multipart/form-data` 请求体。
    问:解释一下 图片是如何发送的
    gpt:

    这段代码使用了 Go 语言的 `mime/multipart` 包来构建一个 `multipart/form-data` 格式的 POST 请求体,用于向服务器上传图片。下面是代码中关键部分的解释:

    1. **创建 buffer 和 multipart.Writer:**
       ```go
       var buffer bytes.Buffer
       writer := multipart.NewWriter(&buffer)
       ```
       这里创建了一个 `bytes.Buffer` 和一个 `multipart.Writer`,后者将数据写入前者。`multipart.Writer` 将帮助我们构建 `multipart/form-data` 格式的请求体。

    2. **创建 form 文件 part:**
       ```go
       part, err := writer.CreateFormFile("media", "blob")
       if err != nil {
           return err
       }
       ```
       这里通过 `CreateFormFile` 创建了一个文件 part,用于上传图片。`media` 是字段名,`blob` 是文件名。

    3. **打开图片文件:**
       ```go
       file, err := os.Open(path)
       if err != nil {
           return err
       }
       defer file.Close()
       ```
       这里打开了指定路径的图片文件。

    4. **将图片内容复制到 part:**
       ```go
       _, err = io.Copy(part, file)
       if err != nil {
           return err
       }
       ```
       这里使用 `io.Copy` 将图片文件的内容复制到 part 中,实现了将图片数据写入请求体的目的。

    5. **写入结束 boundary 和关闭 writer:**
       ```go
       writer.Close()
       ```
       这里调用 `Close` 完成了 `multipart/form-data` 的结束,写入了结束的 boundary。

    6. **创建 HTTP 请求并发送:**
       ```go
       req, err := http.NewRequest("POST", url, &buffer)
       if err != nil {
           return err
       }
       ```
       这里使用 `http.NewRequest` 创建一个 POST 请求,并使用之前构建的 buffer 作为请求体。

    7. **设置请求头:**
       ```go
       req.Header.Set("Content-Type", writer.FormDataContentType())
       ```
       这里设置了请求头,指明请求体的类型为 `multipart/form-data`,同时带上了 boundary。

    8. **发送请求和处理响应:**
       ```go
       client := &http.Client{}
       resp, err := client.Do(req)
       if err != nil {
           return err
       }
       defer resp.Body.Close()
       ```
       这里使用 `http.Client` 发送请求,并在完成后关闭响应体。可以根据实际需求进一步处理服务器的响应。

    总体来说,这段代码通过 `multipart` 包的帮助,将图片文件以 `multipart/form-data` 格式封装成请求体,并通过 HTTP POST 请求发送给服务器。

  • 相关阅读:
    渗透测试流程是什么?7个步骤给你讲清楚!
    【网络】网口工作模式(混杂模式|监听模式|监视模式|管理模式)
    NLP自然语言处理(三)
    Elasticsearch学习系列二(基础操作)
    法国心理健康平台【Teale】完成1000万欧元A轮融资
    08架构管理之架构检查方法
    【Spring】事务和事务传播机制
    Linux实现文件定期本地备份/异地备份/删除备份的脚本
    PostgreSQL、KingBase 数据库 ORDER BY LIMIT 查询缓慢案例
    圆周率介绍
  • 原文地址:https://blog.csdn.net/glc22/article/details/134413555