Golang 使用多部分將大檔案上傳到外部 API。如何避免`io.Copy(io.Writer, io.Reader)`問題
我的目標是使用golang 的內建net/http 套件將一個大檔案上傳到POST https://somehost /media
。
Api呼叫的HTTP格式
POST /media HTTP/1.1 Host: somehost Content-Length: 434 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="detail" More and more detail ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="file"; filename="some_big_video.mp4" Content-Type: <Content-Type header here> (data) ------WebKitFormBoundary7MA4YWxkTrZu0gW--
在 golang 中,這是程式碼。
package main import ( "fmt" "bytes" "mime/multipart" "os" "path/filepath" "io" "net/http" "io/ioutil" ) func main() { url := "https://somehost/media" method := "POST" payload := &bytes.Buffer{} writer := multipart.NewWriter(payload) _ = writer.WriteField("details", "more and more details") file, errFile3 := os.Open("/Users/vajahat/Downloads/some_big_video.mp4") defer file.Close() part3,errFile3 := writer.CreateFormFile("file","some_big_video.mp4") _, errFile3 = io.Copy(part3, file) if errFile3 != nil { fmt.Println(errFile3) return } err := writer.Close() if err != nil { fmt.Println(err) return } client := &http.Client {} req, err := http.NewRequest(method, url, payload) if err != nil { fmt.Println(err) return } req.Header.Set("Content-Type", writer.FormDataContentType()) res, err := client.Do(req) if err != nil { fmt.Println(err) return } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) return } fmt.Println(string(body)) }
如何避免io.Copy(io.Writer, io.Reader)
問題
上面的程式碼運作正常,但在 _, errFile3 = io.Copy(part3, file)
行上。這實際上將文件中的所有內容複製到主記憶體中。
如何避免這種情況?
有什麼辦法,我可以透過 multipart-formdata
將大檔案串流到 api?
該程式將在遠端伺服器上運行。如果打開一個非常大的文件,可能會崩潰。
正確答案
使用 io.Pipe 和 goroutine 將檔案複製到請求而不載入整個檔案記憶體中的檔案。
pr, pw := io.Pipe() writer := multipart.NewWriter(pw) ct := writer.FormDataContentType() go func() { _ = writer.WriteField("details", "more and more details") file, err := os.Open("/Users/vajahat/Downloads/some_big_video.mp4") if err != nil { pw.CloseWithError(err) return } defer file.Close() part3, err := writer.CreateFormFile("file", "some_big_video.mp4") if err != nil { pw.CloseWithError(err) return } _, err = io.Copy(part3, file) if err != nil { pw.CloseWithError(err) return } pw.CloseWithError(writer.Close()) }() client := &http.Client{} req, err := http.NewRequest(method, url, pr) if err != nil { fmt.Println(err) return } req.Header.Set("Content-Type", ct) // remaining code as before
以上是Golang 使用多部分將大檔案上傳到外部 API。如何避免`io.Copy(io.Writer, io.Reader)`問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

基於大模型的持續最佳化,LLM智能體-這些強大的演算法實體已經展現出解決複雜多步驟推理任務的潛力。從自然語言處理到深度學習,LLM智能體正逐漸成為研究和工業界的焦點,它們不僅能理解和生成人類語言,還能在多樣的環境中製定策略、執行任務,甚至使用API調用和編碼來建置解決方案。在這種背景下,AgentQuest框架的提出具有里程碑意義,它不僅僅是一個LLM智能體的評估和進步提供了一個模組化的基準測試平台,而且透過其易於擴展的API,為研究人員提供了一個強大的工具,以更細緻地追蹤和改進這些智能體的性能

如何使用PHP的Web服務和API呼叫隨著網路技術的不斷發展,Web服務和API呼叫已經成為了開發人員不可或缺的一部分。透過使用Web服務和API調用,我們可以輕鬆地與其他的應用程式進行交互,獲取資料或實現特定的功能。而PHP作為一種流行的伺服器端腳本語言,也提供了豐富的函數和工具來支援Web服務和API呼叫的開發。在本文中,我將簡要介紹如何使用PHP來

撰稿丨諾亞出品|51CTO技術棧(微訊號:blog51cto)總被用戶吐槽「有點智障」的Siri有救了! Siri自誕生以來就是智慧語音助理領域的代表之一,但在很長一段時間裡,其表現並不盡如人意。然而,蘋果的人工智慧團隊最新發布的研究成果有望大幅改變現狀。這些成果令人興奮,同時也引發了對該領域未來的極大期待。在相關的研究論文中,蘋果的AI專家們描述了一個系統,其中Siri不僅可以識別圖像中的內容,還能做更多的事情,變得更聰明、更實用。這個功能模型被稱為ReALM,它是基於GPT4.0的標準,具有比

Mingw編譯的軟體是否能夠在Linux環境中使用? Mingw是Windows平台上用來編譯產生可以在Windows上執行的程式的工具鏈。那麼,Mingw編譯的軟體是否能夠在Linux環境中使用呢?答案是可以的,不過需要一些額外的工作和步驟。在Linux上執行Windows上編譯的程序,最常用的方法是使用Wine。 Wine是一個在Linux和其他類別Un

DeepSeekAI工具使用指南及常見問題解答DeepSeek是一款功能強大的AI智能工具,本文將解答一些常見的使用問題,助您快速上手。常見問題解答:不同訪問方式的區別:網頁版、App版和API調用在功能上沒有區別,App只是網頁版的封裝。本地部署使用的是蒸餾模型,能力略遜於完整版DeepSeek-R1,但32位模型理論上擁有90%的完整版能力。酒館(SillyTavern)是什麼? SillyTavern是一個前端界面,需要通過API或Ollama調用AI模型。破限是什麼

我的目標是使用golang的內建net/http套件將一個大檔案上傳到POSThttps://somehost/media。 Api調用的HTTP格式POST/mediaHTTP/1.1Host:somehostContent-Length:434Content-Type:multipart/form-data;boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW------WebKitFormBoundary74YWxkMA44YWxk

PHP快手API介面呼叫技巧:如何處理介面回傳的錯誤訊息在使用PHP進行快手API介面呼叫時,我們常會遇到介面回傳錯誤的情況。對於處理介面傳回的錯誤訊息,我們需要進行適當的處理和回饋,以便提高應用程式的穩定性和使用者體驗。本文將介紹一些處理介面傳回錯誤訊息的技巧,並提供對應的程式碼範例。使用try-catch擷取異常在呼叫API介面時,可能會發生一些異常錯誤,
