go - 使用 POST 请求 golang 上传文件

标签 go httprequest telegram-bot

我是 golang 的新手,我正在尝试编写一个函数,该函数将带有发布请求的文件上传到我正在编写的机器人的电报中。

我试过这段代码,但我从电报中得到的错误是 错误请求:请求中没有照片

我在网上搜索了如何做到这一点,但我发现的都没有帮助我解决这个问题。

func SendPostRequest (url string, filename string) []byte {
    file, err := os.Open(filename)

    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    response, err := http.Post(url, "binary/octet-stream", file)

    if err != nil {
        log.Fatal(err)
    }
    defer response.Body.Close()

    content, err := ioutil.ReadAll(response.Body)

    if err != nil {
        log.Fatal(err)
    }

    return content
}

我从中调用 SendPostRequest 的函数是

func (e Engine) SendPhoto (filename string, chatId int64) APIResponse {
    var url = fmt.Sprintf("%ssendPhoto?chat_id=%d", e.baseUrl, chatId)

    var content []byte = SendPostRequest(url, filename)
    var response APIResponse

    json.Unmarshal(content, &response)
    return response
}

编辑: 我在代码中使用的 Telegram bot api 的链接是 https://core.telegram.org/bots/api

API 方法是https://core.telegram.org/bots/api#sendphoto

最佳答案

经过一番挖掘,我发现了这个

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
        }
        part.Write(f.fdata)
    }

    w.Close()

    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
}

关于go - 使用 POST 请求 golang 上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51234464/

相关文章:

python-telegram-bot错误 'CallbackContext'对象没有属性 'message'

go - 如何strings.Split换行?

http - Go net listener 关闭及常规处理

api - 如何下载发送到 Telegram 机器人的文件或照片?

java - 如何在 Spring MVC 中处理 HTTP header ?

android - 亚马逊认知 : How to stop getting "redirect_mismatch" error when redirecting from browser to Android app

Telegram 机器人读取 channel 更新

go - 为什么在我使用库 golang go-mssqldb 连接到 sql server 后,它打印 <nil>?

thread-safety - Go 的缓冲 channel 是无锁的吗?

java - 在 2 个不同的 struts-action 流中使用请求