Bagaimana untuk mendapatkan multipart.File daripada multipart.Part dalam Go tanpa menyimpan ke cakera?

WBOY
Lepaskan: 2024-02-08 22:03:09
ke hadapan
652 orang telah melayarinya

Bagaimana untuk mendapatkan multipart.File daripada multipart.Part dalam Go tanpa menyimpan ke cakera?

Semasa proses pembangunan bahasa Go, editor Apple Apple sering menghadapi keperluan untuk mendapatkan berbilang bahagian. Fail daripada objek berbilang bahagian. Bahagian apabila menggunakan pakej berbilang bahagian untuk memproses fail muat naik borang. Walau bagaimanapun, pakej berbilang bahagian dalam pustaka standard tidak secara langsung menyediakan kaedah untuk mendapatkan berbilang bahagian. Fail, tetapi menyimpan fail ke cakera secara lalai. Jadi, adakah terdapat cara untuk memintas pengehadan ini dan mendapatkan multipart.Fail terus dari multipart.Part? Seterusnya, kami akan memperkenalkan anda kepada kaedah untuk mendapatkan multipart.Fail daripada multipart.Part dalam Go tanpa menyimpannya ke cakera.

Kandungan soalan

Dalam API saya, saya mempunyai fungsi yang berfungsi dengan baik dengan menghantar dari r.Body 中提取 multipart.File seperti yang ditunjukkan di bawah

file, handler, err := r.FormFile("file")
Salin selepas log masuk

Saya menggunakan multipart.File untuk memuat naik ke s3 API menggunakan klien minio seperti yang ditunjukkan di bawah

err = uploadToMinio(rs, file, fileSize, fileName, guid.String(), userId)
Salin selepas log masuk

Sekarang saya telah menambah data borang tambahan, saya nampaknya tidak boleh menggunakan r.Body untuk mencapai ini lagi. Saya mendapat mesej "Ralat mengambil fail borang" seperti yang ditunjukkan dalam kod di bawah.

Berdasarkan soalan ini, saya melaksanakan MultipartReader untuk mendapatkan data borang daripada multipart.Part.

Bahagian

tidak mempunyai multipart.File jadi saya perlu melaksanakan bahagian itu tanpa menulisnya ke cakera dan membacanya semula jika boleh.

Ini kod saya

var err error

start := time.Now()

const maxUploadSize = 500 * 1024 * 1024 // 500 Mb

var requiredByDate FileRequiredDateData

mr, err := r.MultipartReader()

if err != nil {
    log.Println(err)
    http.Error(w, err.Error(), http.StatusInternalServerError)
    return
}

for {
    part, err := mr.NextPart()

    // This is OK, no more parts
    if err == io.EOF {
        break
    }

    // Some error
    if err != nil {
        log.Println("multipart reader other error")
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    log.Println(part.FormName())

    if part.FormName() == "data" {

        log.Println("multipart reader found multipart form name data")

        decoder := json.NewDecoder(part)

        err = decoder.Decode(&requiredByDate)

        if err != nil {
            log.Println("error in decoding request body data")
            log.Println(err.Error())
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }

    if part.FormName() == "file" {

        file, handler, err := r.FormFile("file") <-- error getting form file here

        if err != nil {
            log.Println("error getting form file")
            log.Println(err.Error())
            http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusInternalServerError)
            return
        }

        defer file.Close()

----

    err = uploadToMinio(rs, file, fileSize, fileName, guid.String(), userId)

        if err != nil {
            log.Println(err)
            http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
            return
        }
Salin selepas log masuk

Penyelesaian

Anda sudah menstrim bahagian borang, anda tidak boleh menghubungi FormFile,您必须自己读取该文件。使用 part.Read 读取文件的字节,或者复制文件等。请注意,part 实现了 io.Reader sekarang supaya anda boleh membaca daripadanya seperti fail.

Atas ialah kandungan terperinci Bagaimana untuk mendapatkan multipart.File daripada multipart.Part dalam Go tanpa menyimpan ke cakera?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!