2017-08-07 2 views
1

Je suis nouveau dans le langage golang, et je veux créer REST API WebServer pour le téléchargement de fichiers ...golang envoyer le fichier via une requête POST

Je suis coincé dans la fonction principale (téléchargement de fichiers) via une requête POST à ​​mon serveur ...

J'ai cette ligne pour appeler la fonction de téléchargement

router.POST("/upload", UploadFile) 

et ceci est ma fonction de téléchargement:

func UploadFile(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { 
    io.WriteString(w, "Upload files\n") 
    postFile(r.Form.Get("file"), "/uploads") 
} 

func postFile(filename string, targetUrl string) error { 
    bodyBuf := &bytes.Buffer{} 
    bodyWriter := multipart.NewWriter(bodyBuf) 

    // this step is very important 
    fileWriter, err := bodyWriter.CreateFormFile("file", filename) 
    if err != nil { 
     fmt.Println("error writing to buffer") 
     return err 
    } 

    // open file handle 
    fh, err := os.Open(filename) 
    if err != nil { 
     fmt.Println("error opening file") 
     return err 
    } 

    //iocopy 
    _, err = io.Copy(fileWriter, fh) 
    if err != nil { 
     panic(err) 
    } 

    bodyWriter.FormDataContentType() 
    bodyWriter.Close() 

    return err 

} 

mais je ne vois aucun fichier téléchargé dans mon répertoire /upload/ ...

Alors qu'est-ce que je fais mal?

P.S Je reçois deuxième erreur =>error opening file, donc je pense que quelque chose ne va pas dans le téléchargement de fichier ou obtenir le fichier de la fonction UploadFile, ai-je raison? Si oui, comment je peux teancfer ou obtenir le fichier de cette fonction à la fonction postFile?

Répondre

2

os.Open va ouvrir un fichier, puisque le fichier n'existe pas, vous obtiendrez une erreur. Utilisez à la place os.Create pour créer un nouveau fichier et l'ouvrir. (Ref: https://golang.org/pkg/os/#Open)

func Ouvrir

func Open(name string) (*File, error)

Ouvrir ouvre le fichier nommé pour lecture. En cas de succès, les méthodes sur le fichier retourné peuvent être utilisées pour lecture; le descripteur de fichier associé a le mode O_RDONLY. S'il y a une erreur, ce sera de type * PathError.

FNC Créer

func Create(name string) (*File, error)

Créer crée le fichier nommé avec le mode 0666 (avant umask), tronquer si elle existe déjà. En cas de succès, les méthodes sur le fichier retourné peuvent être utilisées pour les E/S; le descripteur de fichier associé a mode O_RDWR. S'il y a une erreur, ce sera de type * PathError.

EDIT

fait un nouveau gestionnaire comme un exemple: Et aussi en utilisant OpenFile comme mentionné par: GoLang send file via POST request

func Upload(w http.ResponseWriter, r *http.Request) { 
    io.WriteString(w, "Upload files\n") 

    file, handler, err := r.FormFile("file") 
    if err != nil { 
     panic(err) //dont do this 
    } 
    defer file.Close() 

    // copy example 
    f, err := os.OpenFile(handler.Filename, os.O_WRONLY|os.O_CREATE, 0666) 
    if err != nil { 
     panic(err) //please dont 
    } 
    defer f.Close() 
    io.Copy(f, file) 

} 
+1

https://golang.org/pkg/os/#OpenFile vous permet d'effectuer une gestion de mode plus précise que les autres fonctions. – bayrinat

+0

ok, mais comment puis-je obtenir le fichier que j'envoie au serveur? parce que je peux créer un fichier, mais ce n'est pas pareil que j'envoie ... – vladimir

+0

@Fredrik Mårlind merci !!!! Ça a marché!!!! – vladimir

3

Le multipart.Writergénère des messages multipart, ce n'est pas quelque chose vous voulez utiliser pour recevoir un fichier d'un client et l'enregistrer sur le disque.

En supposant que vous téléchargez le fichier à partir d'un client, par ex.un navigateur, avec Content-Type: application/x-www-form-urlencoded vous devriez utiliser FormFile au lieu de r.Form.Get qui renvoie une valeur *multipart.File qui contient le contenu du fichier envoyé par le client et que vous pouvez utiliser pour écrire ce contenu sur le disque avec io.Copy ou quoi que ce soit.

+0

@mkporiva, oui, maintenant je l'utilise et ça marche parfaitement !!! – vladimir