在Go 中使用POST 請求上傳檔案
透過HTTP POST 請求上傳檔案可能是一項複雜的任務,尤其是在處理第三方時- 第三方API,例如Telegram。為了解決這個問題,讓我們探索一個用 Golang 編寫的自訂函數,它可以有效地處理檔案上傳。
問題:
您遇到了來自 Telegram 的錯誤,指示照片遺失在請求中,即使遵循不成功的線上解決方案也是如此。
程式碼片段:
提供的程式碼片段嘗試使用 os.Open() 函數上傳文件,但由於 Telegram 的特定 API 要求,它失敗了。
解決方案:
要解決此問題,我們將建立一個使用 multipart/form- 的自訂 sendPostRequest 函數 -處理檔案上傳的資料請求。此方法得到 Web 伺服器和 API 的廣泛支援。以下是更新後的程式碼:
<code class="go">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 } _, err = part.Write(f.fdata) if err != nil { return []byte{}, err } } err := w.Close() if err != nil { return []byte{}, err } 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 }</code>
理解解決方案:
sendPostRequest 函數接受一個URL 和可變數量的內容結構,每個內容結構代表一個要傳送的文件。已上傳。它建構一個多部分 HTTP 請求,其中每個檔案都包含其元資料(名稱、類型和資料)。這種格式確保與 Telegram 的 API 相容。
用法:
您可以使用檔案資訊呼叫 sendPostRequest 函數,並在 cnt 變數中接收伺服器的回應。例如:
<code class="go">resp, err := sendPostRequest("https://your-url.com", content{fname: "photo.jpg", ftype: "image/jpeg", fdata: []byte{your_file_data}}) if err != nil { // Handle error }</code>
結論:
這個自訂的sendPostRequest 函數解決了Golang 中透過POST 請求上傳檔案的問題,專門解決了Telegram 的檔案上傳需求。透過使用 multipart/form-data,它可以確保相容性並使將檔案上傳到遠端伺服器變得更容易。
以上是如何在 Golang 中使用 POST 請求將檔案上傳到 Telegram?的詳細內容。更多資訊請關注PHP中文網其他相關文章!