Maison  >  Article  >  développement back-end  >  Comment obtenir multipart.File à partir de multipart.Part dans Go sans enregistrer sur le disque ?

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

WBOY
WBOYavant
2024-02-08 22:03:09634parcourir

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

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.

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
        }

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer