【问题标题】:Upload a file with POST request golang使用 POST 请求 golang 上传文件
【发布时间】:2018-12-16 11:36:14
【问题描述】:

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

我已尝试使用此代码,但我从电报中得到的错误是 Bad Request: there is no photo in the request.

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

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

【问题讨论】:

  • 希望得到帮助:GIST
  • 文档说要使用 multipart/form-data 上传文件。
  • @MichaelHampton 我尝试使用“multipart/form-data”而不是“binary/octet-stream”,但它无论如何也不会工作,也没有来自电报的错误消息。
  • 问题是您没有在请求中设置照片参数名称。另外,我建议不要创建集成,而是使用这个包 github.com/go-telegram-bot-api/telegram-bot-api 。有UploadFile 方法可能很容易解决您的问题
  • @ttomalak 你能解释一下如何在请求中设置照片参数名称吗?

标签: go httprequest telegram-bot


【解决方案1】:

经过一番挖掘,我想通了

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

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


    body := &bytes.Buffer{}
    writer := multipart.NewWriter(body)
    part, err := writer.CreateFormFile(filetype, filepath.Base(file.Name()))

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

    io.Copy(part, file)
    writer.Close()
    request, err := http.NewRequest("POST", url, body)

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

    request.Header.Add("Content-Type", writer.FormDataContentType())
    client := &http.Client{}

    response, err := client.Do(request)

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

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

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

    return content
}

【讨论】:

    猜你喜欢
    • 2021-08-10
    • 2014-10-10
    • 1970-01-01
    • 2018-06-08
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多