Maison > développement back-end > Golang > le corps du texte

Comment obtenir multipart.File à partir de multipart.Part dans Go sans enregistrer sur le disque ?

WBOY
Libérer: 2024-02-08 22:03:09
avant
653 Les gens l'ont consulté

Comment obtenir multipart.File à partir de multipart.Part dans Go sans enregistrer sur le disque ?

Au cours du processus de développement du langage Go, l'éditeur Apple rencontre souvent le besoin d'obtenir multipart.File à partir de l'objet multipart.Part lors de l'utilisation du package multipart pour traiter les fichiers de téléchargement de formulaire. Cependant, le package multipart de la bibliothèque standard ne fournit pas directement de méthode pour obtenir multipart.File, mais enregistre le fichier sur le disque par défaut. Alors, existe-t-il un moyen de contourner cette limitation et d'obtenir multipart.File directement à partir de multipart.Part ? Ensuite, nous vous présenterons une méthode pour obtenir multipart.File à partir de multipart.Part in Go sans l'enregistrer sur le disque.

Contenu de la question

Dans mon API go, j'ai une fonction qui fonctionnait bien en passant de r.Body 中提取 multipart.File comme indiqué ci-dessous

file, handler, err := r.FormFile("file")
Copier après la connexion

J'utilise multipart.File pour télécharger sur l'API s3 à l'aide du client minio comme indiqué ci-dessous

err = uploadToMinio(rs, file, fileSize, fileName, guid.String(), userId)
Copier après la connexion

Maintenant que j'ai ajouté des données de formulaire supplémentaires, je n'arrive plus à utiliser r.Body pour y parvenir. Je reçois un message « Erreur lors de la récupération du fichier de formulaire », comme indiqué dans le code ci-dessous.

Sur la base de cette question, j'ai implémenté MultipartReader pour obtenir les données de formulaire de multipart.Part.

La partie

n'a pas multipart.File, je dois donc implémenter cette partie sans l'écrire sur le disque et la relire si possible.

Voici mon code

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
        }
Copier après la connexion

Solution de contournement

Vous diffusez déjà des parties du formulaire, vous ne pouvez pas appeler FormFile,您必须自己读取该文件。使用 part.Read 读取文件的字节,或者复制文件等。请注意,part 实现了 io.Reader maintenant pour pouvoir le lire comme un fichier.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!