在 Go 中使用 POST 请求上传文件
通过 HTTP POST 请求上传文件可能是一项复杂的任务,尤其是在处理第三方时- 第三方 API,例如 Telegram。为了解决这个问题,让我们探索一个用 Golang 编写的自定义函数,它可以有效地处理文件上传。
问题:
您遇到了来自 Telegram 的错误,指示照片丢失在请求中,即使遵循不成功的在线解决方案也是如此。
代码片段:
提供的代码片段尝试使用 os.Open() 函数上传文件,但由于 Telegram 的特定 API 要求,它失败了。
解决方案:
要解决此问题,我们将创建一个使用 multipart/form- 的自定义 sendPostRequest 函数 -处理文件上传的数据请求。此方法得到 Web 服务器和 API 的广泛支持。以下是更新后的代码:
<code class="go">import ( "bytes" "io" "mime/multipart" "net/http" "path/filepath" ) // content is a struct which contains a file's name, its type and its data. type content struct { fname string ftype string fdata []byte } func sendPostRequest(url string, files ...content) ([]byte, error) { var ( buf = new(bytes.Buffer) w = multipart.NewWriter(buf) ) 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 } } err := w.Close() if err != nil { return []byte{}, err } req, err := http.NewRequest("POST", url, buf) if err != nil { return []byte{}, err } req.Header.Add("Content-Type", w.FormDataContentType()) client := &http.Client{} res, err := client.Do(req) if err != nil { return []byte{}, err } defer res.Body.Close() cnt, err := io.ReadAll(res.Body) if err != nil { return []byte{}, err } return cnt, nil }</code>
理解解决方案:
sendPostRequest 函数接受一个 URL 和可变数量的内容结构,每个内容结构代表一个要发送的文件。已上传。它构造一个多部分 HTTP 请求,其中每个文件都包含其元数据(名称、类型和数据)。这种格式确保与 Telegram 的 API 兼容。
用法:
您可以使用文件信息调用 sendPostRequest 函数,并在 cnt 变量中接收服务器的响应。例如:
<code class="go">resp, err := sendPostRequest("https://your-url.com", content{fname: "photo.jpg", ftype: "image/jpeg", fdata: []byte{your_file_data}}) if err != nil { // Handle error }</code>
结论:
这个自定义的 sendPostRequest 函数解决了 Golang 中通过 POST 请求上传文件的问题,专门解决了 Telegram 的文件上传需求。通过使用 multipart/form-data,它可以确保兼容性并使将文件上传到远程服务器变得更容易。
以上是如何在 Golang 中使用 POST 请求将文件上传到 Telegram?的详细内容。更多信息请关注PHP中文网其他相关文章!