目錄
正確答案
首頁 後端開發 Golang Golang 使用多部分將大檔案上傳到外部 API。如何避免`io.Copy(io.Writer, io.Reader)`問題

Golang 使用多部分將大檔案上傳到外部 API。如何避免`io.Copy(io.Writer, io.Reader)`問題

Feb 06, 2024 am 09:45 AM
api調用

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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

探索智能體的邊界:AgentQuest,一個全面衡量和提升大型語言模型智能體性能的模組化基準框架 探索智能體的邊界:AgentQuest,一個全面衡量和提升大型語言模型智能體性能的模組化基準框架 Apr 11, 2024 pm 08:52 PM

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

查看自己萊特幣錢包地址 查看自己萊特幣錢包地址 Apr 07, 2024 pm 05:12 PM

要查看萊特幣錢包地址,可訪問萊特幣錢包並在“接收”選項卡中查找地址;還可以使用區塊鏈瀏覽器或API調用。

如何利用PHP呼叫Web服務和API? 如何利用PHP呼叫Web服務和API? Jun 30, 2023 pm 03:03 PM

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

讓Siri不再智障!蘋果定義新的端側模型,「大大優於GPT-4,擺脫文本,可視化模擬螢幕訊息,最小參數模型相較基線系統仍提升5% 讓Siri不再智障!蘋果定義新的端側模型,「大大優於GPT-4,擺脫文本,可視化模擬螢幕訊息,最小參數模型相較基線系統仍提升5% Apr 02, 2024 pm 09:20 PM

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

Mingw編譯的軟體是否能夠在Linux環境中使用? Mingw編譯的軟體是否能夠在Linux環境中使用? Mar 20, 2024 pm 05:06 PM

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

DeepSeek使用常見問題匯總 DeepSeek使用常見問題匯總 Feb 19, 2025 pm 03:45 PM

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

Golang 使用多部分將大檔案上傳到外部 API。如何避免`io.Copy(io.Writer, io.Reader)`問題 Golang 使用多部分將大檔案上傳到外部 API。如何避免`io.Copy(io.Writer, io.Reader)`問題 Feb 06, 2024 am 09:45 AM

我的目標是使用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介面呼叫技巧:如何處理介面回傳的錯誤訊息 Jul 20, 2023 pm 11:22 PM

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

See all articles