上载带有POST请求golang的文件 [英] Upload a file with POST request golang

查看:157
本文介绍了上载带有POST请求golang的文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是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机器人api的链接为 https://core.telegram.org /bots/api

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

解决方案

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

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
}

I'm new to golang and I'm trying to write a function that uploads a file with a post request to telegram for a bot I'm writing.

I've tried with this code but the error I'm getting from telegram is Bad Request: there is no photo in the request.

I've searched on the net for how to do that, but none of what I found helped me through the problem.

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
}

The function I'm calling the SendPostRequest from is

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
}

EDIT: The link to the Telegram bot api I'm using in the code is https://core.telegram.org/bots/api

And the api method is https://core.telegram.org/bots/api#sendphoto

解决方案

After some digging I figured it out with this

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
}

这篇关于上载带有POST请求golang的文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆