Maison >développement back-end >Golang >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.
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")
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)
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.
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 }
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!