web-dev-qa-db-ja.com

POST request golangでファイルをアップロードします

私はgolangの初心者であり、私が書いているボットの電報への投稿リクエストを含むファイルをアップロードする関数を書こうとしています。

私はこのコードで試しましたが、電報から得ているエラーは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

4
NicoNex

少し掘り下げた後、これでわかりました

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
}
4
NicoNex