2016-03-06 5 views
0

Dans mon cas d'utilisation j'essaye de télécharger un fichier au serveur dans golang. J'ai le code HTML suivant,Le téléchargement de fichier échoue dans golang

<div class="form-input upload-file" enctype="multipart/form-data" > 
    <input type="file"name="file" id="file" /> 
    <input type="hidden"name="token" value="{{.}}" /> 
    <a href="/uploadfile/" data-toggle="tooltip" title="upload"> 
     <input type="button upload-video" class="btn btn-primary btn-filled btn-xs" value="upload" /> 
    </a> 
</div> 

Et le côté serveur,

func uploadHandler(w http.ResponseWriter, r *http.Request) { 
    // the FormFile function takes in the POST input id file 
    file, header, err := r.FormFile("file") 
    if err != nil { 
     fmt.Fprintln(w, err) 
     return 
    } 
    defer file.Close() 

    out, err := os.Create("/tmp/uploadedfile") 
    if err != nil { 
     fmt.Fprintf(w, "Unable to create the file for writing. Check your write access privilege") 
     return 
    } 
    defer out.Close() 

    // write the content from POST to the file 
    _, err = io.Copy(out, file) 
    if err != nil { 
     fmt.Fprintln(w, err) 
    } 

    fmt.Fprintf(w, "File uploaded successfully : ") 
    fmt.Fprintf(w, header.Filename) 
} 

Lorsque je tente de télécharger le fichier, je reçois request Content-Type isn't multipart/form-data erreur côté serveur.

Quelqu'un peut-il m'aider?

Répondre

1

Pour être honnête, je n'ai aucune idée de comment vous obtenez même l'erreur que votre HTML n'est pas une forme. Mais je pense que vous obtenez une erreur car par défaut, le formulaire est envoyé en tant que requête GET tandis que multipart/form-data doit être envoyé via POST. Voici un exemple de forme minimale qui devrait fonctionner.

<form action="/uploadfile/" enctype="multipart/form-data" method="post"> 
    <input type="file" name="file" id="file" /> 
    <input type="hidden"name="token" value="{{.}}" /> 
    <input type="submit" value="upload" /> 
</form> 
+0

Merci. J'essaie d'utiliser cela à l'intérieur d'une autre forme. donc j'ai essayé de cette façon. Y a-t-il un quelconque travail pour l'utiliser sous une autre forme? Il serait très utile – Dany

+0

@DineshAppavoo Formulaire à l'intérieur du formulaire? –

+0

semble que ce n'est pas possible [nest-forms] (http://stackoverflow.com/questions/379610/can-you-nest-html-forms). J'ai essayé, le formulaire original s'est effondré. Y at-il une solution de contournement pour cela? – Dany

1

Le problème est que vous devez inclure l'en-tête qui contient le type de contenu.

req.Header.Add("Content-Type", writer.FormDataContentType()) 

Ceci est inclus dans le package mime/multipart.

Pour un exemple de travail s'il vous plaît vérifier this blog.

+0

Il n'essaie pas d'envoyer un formulaire à partir de l'application Go. Il ne peut pas obtenir les données de formulaire HTML dans son application Go. –

+0

Oui, et c'est la raison pour laquelle il reçoit l'erreur ci-dessus. –

+0

Son code Go fonctionne parfaitement avec la forme HTML appropriée. Et votre lien concerne l'envoi de données depuis Go to remote service. –