Jadual Kandungan
Jawapan betul
Rumah pembangunan bahagian belakang Golang Golang menggunakan berbilang bahagian untuk memuat naik fail besar ke API luaran. Bagaimana untuk mengelakkan masalah `io.Copy(io.Writer, io.Reader)`

Golang menggunakan berbilang bahagian untuk memuat naik fail besar ke API luaran. Bagaimana untuk mengelakkan masalah `io.Copy(io.Writer, io.Reader)`

Feb 06, 2024 am 09:45 AM
panggilan api

Golang 使用多部分将大文件上传到外部 API。如何避免`io.Copy(io.Writer, io.Reader)`问题

Kandungan soalan

Matlamat saya adalah untuk memuat naik fail besar ke POST https://somehost/media menggunakan pakej net/http terbina dalam golang.

Format HTTP untuk panggilan Api

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--
Salin selepas log masuk

Di golang, ini kodnya.

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))
}
Salin selepas log masuk

Bagaimana untuk mengelakkan io.Copy(io.Writer, io.Reader)masalah

Kod di atas berfungsi dengan baik, tetapi pada baris _, errFile3 = io.Copy(part3, file). Ini pada asasnya menyalin segala-galanya dalam fail ke dalam ingatan utama.

Bagaimana untuk mengelakkan situasi ini?

Adakah ada cara saya boleh menstrim fail besar ke api melalui multipart-formdata?

Program ini akan berjalan pada pelayan jauh. Boleh ranap jika membuka fail yang sangat besar.


Jawapan betul


Gunakan io.Pipe dan goroutine untuk menyalin fail ke permintaan tanpa memuatkan keseluruhan fail dalam memori.

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
Salin selepas log masuk

Atas ialah kandungan terperinci Golang menggunakan berbilang bahagian untuk memuat naik fail besar ke API luaran. Bagaimana untuk mengelakkan masalah `io.Copy(io.Writer, io.Reader)`. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Meneroka sempadan ejen: AgentQuest, rangka kerja penanda aras modular untuk mengukur dan meningkatkan prestasi ejen model bahasa besar secara menyeluruh Meneroka sempadan ejen: AgentQuest, rangka kerja penanda aras modular untuk mengukur dan meningkatkan prestasi ejen model bahasa besar secara menyeluruh Apr 11, 2024 pm 08:52 PM

Berdasarkan pengoptimuman berterusan model besar, ejen LLM - entiti algoritma yang berkuasa ini telah menunjukkan potensi untuk menyelesaikan tugas penaakulan pelbagai langkah yang kompleks. Daripada pemprosesan bahasa semula jadi kepada pembelajaran mendalam, ejen LLM secara beransur-ansur menjadi tumpuan penyelidikan dan industri Mereka bukan sahaja dapat memahami dan menjana bahasa manusia, tetapi juga merumuskan strategi, melaksanakan tugas dalam persekitaran yang pelbagai, dan juga menggunakan panggilan API dan pengekodan untuk Membina. penyelesaian. Dalam konteks ini, pengenalan rangka kerja AgentQuest merupakan satu peristiwa penting Ia bukan sahaja menyediakan platform penanda aras modular untuk penilaian dan kemajuan ejen LLM, tetapi juga menyediakan penyelidik dengan alat yang Berkuasa untuk menjejak dan meningkatkan prestasi ejen ini pada masa yang tertentu. tahap yang lebih berbutir

Bagaimana untuk menggunakan PHP untuk memanggil perkhidmatan web dan API? Bagaimana untuk menggunakan PHP untuk memanggil perkhidmatan web dan API? Jun 30, 2023 pm 03:03 PM

Cara menggunakan perkhidmatan Web PHP dan panggilan API Dengan perkembangan teknologi Internet yang berterusan, perkhidmatan Web dan panggilan API telah menjadi bahagian yang amat diperlukan dalam pembangun. Dengan menggunakan perkhidmatan web dan panggilan API, kami boleh berinteraksi dengan mudah dengan aplikasi lain untuk mendapatkan data atau melaksanakan fungsi tertentu. Sebagai bahasa skrip sebelah pelayan yang popular, PHP juga menyediakan pelbagai fungsi dan alatan untuk menyokong pembangunan perkhidmatan Web dan panggilan API. Dalam artikel ini, saya akan memperkenalkan secara ringkas cara menggunakan PHP untuk

Lihat alamat dompet Litecoin anda Lihat alamat dompet Litecoin anda Apr 07, 2024 pm 05:12 PM

Untuk melihat alamat dompet Litecoin, lawati dompet Litecoin dan cari alamat dalam tab "Terima" anda juga boleh menggunakan penyemak imbas blockchain atau panggilan API.

Bolehkah perisian yang disusun oleh Mingw digunakan dalam persekitaran Linux? Bolehkah perisian yang disusun oleh Mingw digunakan dalam persekitaran Linux? Mar 20, 2024 pm 05:06 PM

Bolehkah perisian yang disusun oleh Mingw digunakan dalam persekitaran Linux? Mingw ialah rantai alat yang digunakan pada platform Windows untuk menyusun dan menjana program yang boleh dijalankan pada Windows. Jadi, bolehkah perisian yang disusun oleh Mingw digunakan dalam persekitaran Linux? Jawapannya ya, tetapi ia memerlukan beberapa kerja dan langkah tambahan. Cara yang paling biasa untuk menjalankan program yang disusun pada Windows pada Linux ialah menggunakan Wine. Wain ialah alat yang digunakan dalam Linux dan Un

Ringkasan Soalan Lazim untuk Penggunaan DeepSeek Ringkasan Soalan Lazim untuk Penggunaan DeepSeek Feb 19, 2025 pm 03:45 PM

Panduan Pengguna Alat DeepSeekai dan FAQ DeepSeek adalah alat pintar AI yang kuat. FAQ: Perbezaan antara kaedah akses yang berbeza: Tidak ada perbezaan fungsi antara versi web, versi aplikasi dan panggilan API, dan aplikasi hanya pembungkus untuk versi web. Penggunaan tempatan menggunakan model penyulingan, yang sedikit lebih rendah daripada versi penuh DeepSeek-R1, tetapi model 32-bit secara teorinya mempunyai keupayaan versi penuh 90%. Apa itu bar? Sillytavern adalah antara muka depan yang memerlukan memanggil model AI melalui API atau Ollama. Apa itu Had Breaking

Biarkan Siri tidak lagi terencat akal! Apple mentakrifkan model sisi peranti baharu, yang 'jauh lebih baik daripada GPT-4 Ia menyingkirkan teks dan mensimulasikan maklumat skrin secara visual Model parameter minimum masih 5% lebih baik daripada sistem garis dasar. Biarkan Siri tidak lagi terencat akal! Apple mentakrifkan model sisi peranti baharu, yang 'jauh lebih baik daripada GPT-4 Ia menyingkirkan teks dan mensimulasikan maklumat skrin secara visual Model parameter minimum masih 5% lebih baik daripada sistem garis dasar. Apr 02, 2024 pm 09:20 PM

Ditulis oleh Noah |. 51CTO Technology Stack (WeChat ID: blog51cto) Siri, yang sentiasa dikritik oleh pengguna sebagai "agak terencat akal", boleh diselamatkan! Siri merupakan salah seorang wakil dalam bidang pembantu suara pintar sejak kelahirannya, tetapi prestasinya tidak memuaskan sejak sekian lama. Bagaimanapun, hasil penyelidikan terkini yang dikeluarkan oleh pasukan kecerdasan buatan Apple dijangka akan mengubah status quo dengan ketara. Keputusan ini menarik dan meningkatkan jangkaan yang besar untuk masa depan bidang ini. Dalam kertas penyelidikan berkaitan, pakar AI Apple menerangkan sistem yang Siri boleh melakukan lebih daripada sekadar mengenal pasti kandungan dalam imej, menjadi lebih pintar dan lebih berguna. Model berfungsi ini dipanggil ReALM, yang berdasarkan piawaian GPT4.0 dan mempunyai a

Golang menggunakan berbilang bahagian untuk memuat naik fail besar ke API luaran. Bagaimana untuk mengelakkan masalah `io.Copy(io.Writer, io.Reader)` Golang menggunakan berbilang bahagian untuk memuat naik fail besar ke API luaran. Bagaimana untuk mengelakkan masalah `io.Copy(io.Writer, io.Reader)` Feb 06, 2024 am 09:45 AM

Matlamat saya adalah untuk memuat naik fail besar ke POST https://somehost/media menggunakan pakej net/http terbina dalam golang. Format HTTP POST/mediaHTTP/1.1Host:somehostContent-Length:434Content-Type:multipart/form-data;boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW------WebKitFormBoundary7MA4YWxkTr

Kemahiran memanggil antara muka PHP Kuaishou API: cara mengendalikan maklumat ralat yang dikembalikan oleh antara muka Kemahiran memanggil antara muka PHP Kuaishou API: cara mengendalikan maklumat ralat yang dikembalikan oleh antara muka Jul 20, 2023 pm 11:22 PM

Petua panggilan antara muka API PHP Kuaishou: Cara mengendalikan mesej ralat yang dikembalikan oleh antara muka Apabila menggunakan PHP untuk memanggil antara muka API Kuaishou, kita sering menghadapi situasi di mana antara muka mengembalikan ralat. Untuk maklumat ralat yang dikembalikan oleh antara muka pemprosesan, kami perlu menyediakan pemprosesan dan maklum balas yang sesuai untuk meningkatkan kestabilan dan pengalaman pengguna aplikasi. Artikel ini akan memperkenalkan beberapa teknik untuk mengendalikan maklumat ralat yang dikembalikan oleh antara muka dan memberikan contoh kod yang sepadan. Gunakan try-catch untuk menangkap pengecualian Apabila memanggil antara muka API, beberapa ralat pengecualian mungkin berlaku.

See all articles