Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mendapatkan multipart.File daripada multipart.Part dalam Go tanpa menyimpan ke cakera?

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

WBOY
WBOYke hadapan
2024-02-08 22:03:09634semak imbas

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")

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)

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
        }

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam