在尝试编写通过 POST 请求将文件上传到 Telegram 的函数时,您遇到了错误“错误请求:请求中没有照片”。您最初使用 SendPostRequest 函数的方法被证明是不成功的。
经过彻底研究,发现了以下改进的解决方案:
<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) ) // Iterate over the files and add them as form fields 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 } } // Close the multipart writer err := w.Close() if err != nil { return []byte{}, err } // Create a new POST request req, err := http.NewRequest("POST", url, buf) if err != nil { return []byte{}, err } // Set the Content-Type header req.Header.Add("Content-Type", w.FormDataContentType()) // Create a new HTTP client client := &http.Client{} // Send the request res, err := client.Do(req) if err != nil { return []byte{}, err } // Close the response body defer res.Body.Close() // Read the response body cnt, err := io.ReadAll(res.Body) if err != nil { return []byte{}, err } return cnt, nil }</code>
此更新的解决方案采用多部分形式发送文件的数据,这解决了问题并确保该文件存在于请求中。
以上是使用 Golang 向 Telegram 机器人发送文件时如何修复“错误请求:请求中没有照片”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!