在 Go 中使用 POST 请求上传文件
通过 POST 请求上传文件是开发 Web 应用程序时的常见任务。当使用 Telegram 机器人时,这一点变得更加重要,因为 Telegram 机器人需要在 API 调用中上传文件。
不幸的是,使用简单的 http.Post 函数可能会导致错误,例如“错误请求:没有请求中的照片。”要解决此问题,您需要使用 multipart/form-data 内容类型发送文件。以下是实现此目标的方法:
创建内容结构:
定义一个内容结构来表示文件的元数据和数据:
<code class="go">type content struct { fname string ftype string fdata []byte }</code>
多部分表单生成器:
使用 multipart.NewWriter 创建新的多部分表单生成器:
<code class="go">var buf = new(bytes.Buffer) var w multipart.NewWriter(buf)</code>
添加文件数据:
迭代您需要上传的文件并为每个文件创建一个表单部分:
<code class="go">for _, f := range files { part, err := w.CreateFormFile(f.ftype, filepath.Base(f.fname)) if err != nil { return []byte{}, err } _, err = part.Write(f.fdata) if err != nil { return []byte{}, err } }</code>
关闭表单:
添加所有文件后,关闭多部分表单生成器:
<code class="go">err := w.Close() if err != nil { return []byte{}, err }</code>
创建 HTTP 请求:
使用 http.NewRequest 创建新的 HTTP 请求:
<code class="go">req, err := http.NewRequest("POST", url, buf) if err != nil { return []byte{}, err }</code>
设置内容类型:
设置 Content-Type 标头以指示您正在发送多部分/表单数据:
<code class="go">req.Header.Add("Content-Type", w.FormDataContentType())</code>
发送请求:
使用 HTTP 客户端发送 HTTP 请求:
<code class="go">client := &http.Client{} res, err := client.Do(req) if err != nil { return []byte{}, err }</code>
读取响应:
读取响应正文:
<code class="go">cnt, err := io.ReadAll(res.Body) if err != nil { return []byte{}, err }</code>
按照以下步骤,您可以在 Go 中使用 POST 请求成功上传文件,包括在使用 Telegram 机器人时。
以上是如何在 Go 中使用 POST 请求上传文件?的详细内容。更多信息请关注PHP中文网其他相关文章!