Upload a file with POST request golang

18,995

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
}
Share:
18,995

Related videos on Youtube

NicoNex
Author by

NicoNex

Updated on October 12, 2022

Comments

  • NicoNex
    NicoNex over 1 year

    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

    • Michael Hampton
      Michael Hampton almost 6 years
      The docs say to upload the file with multipart/form-data.
    • NicoNex
      NicoNex almost 6 years
      @ttomalak could you please explain me how to set the photo parameter name in the request?