packagemainimport("fmt""io""log""net/http""os""path/filepath")funcmain(){createUploadDir(uploadDir)// on enregistre le handler d'upload sur le / du site dans le routeur par défauthttp.HandleFunc("/",handleUpload)// on écoute sur le port :9090 sur toutes les interfaces de la machine// en utilisant le routeur par défauthttp.ListenAndServe(":9090",nil)}funchandleUpload(whttp.ResponseWriter,r*http.Request){log.Println("method:",r.Method)ifr.Method=="GET"{// On écrit dans le ResponseWriter le code HTML, ce qui permet d'afficher// la page sur le navigateurfmt.Fprint(w,uploadHTML)}else{// Le serveur utilisera 10Mo en mémoire pendant l'upload, le reste// sera stocker sur des fichiers temporaire sur le disque.r.ParseMultipartForm(10_000_000)file,header,err:=r.FormFile("uploadfile")iferr!=nil{// On logge l'erreur sur le serveurlog.Println(err)// On renvoit une erreur 500 avec le message d'erreur sur le navigateurhttp.Error(w,err.Error(),http.StatusInternalServerError)return}// On ferme le Reader des données de formulaire à la sortie de la fonctiondeferfile.Close()// On ouvre un fichier en écriture pour enregistrer l'upload, dans le dossier d'uploadf,err:=os.OpenFile(filepath.Join(uploadDir,header.Filename),os.O_WRONLY|os.O_CREATE,0666)iferr!=nil{log.Println(err)http.Error(w,err.Error(),http.StatusInternalServerError)return}// On ferme le fichier créé à la sortie de la fonctiondeferf.Close()// On copie les données d'upload dans le fichier sur le serveur_,err=io.Copy(f,file)iferr!=nil{log.Println(err)http.Error(w,err.Error(),http.StatusInternalServerError)return}// On écrite les métadonnées du fichier uploadé dans le ResponseWriterfmt.Fprint(w,header.Header)}}// createUploadDir créé un dossier d'upload où stocker les fichiersfunccreateUploadDir(uploadDirstring){err:=os.Mkdir(uploadDir,0770)iferr!=nil{log.Println(err)}}const(// uploadDir est le dossier de stockage des fichiers uploadésuploadDir="./test"// uploadHTML est une chaîne contenant le HTML de la page d'uploaduploadHTML=`<html><head> <title>Upload file</title></head><body><form enctype="multipart/form-data" action="http://127.0.0.1:9090/" method="post"> <input type="file" name="uploadfile" /> <input type="submit" value="upload" /></form></body></html>`)
Pas le code le plus idiomatique, ni le plus beau, mais il est concis et j'espère "facile" à comprendre. Si besoin d'explications, n'hésite pas.
Mais clairement, il manque beaucoup pour en faire un truc vraiment correct (jeton CSRF, templating, CSS, etc).
L'un des avantages, c'est que ça produit un simple fichier binaire que tu peux copier coller sur n'importe quel serveur en ssh, et ça tourne. Pas besoin d'installer 100 packages ou des dépendances dans tous les sens. Juste le binaire et c'est bon.
# Go
Posté par 16aR . En réponse au message Service upload de fichiers http. Évalué à 1.
En Go, en 1 seul fichier:
Pas le code le plus idiomatique, ni le plus beau, mais il est concis et j'espère "facile" à comprendre. Si besoin d'explications, n'hésite pas.
Mais clairement, il manque beaucoup pour en faire un truc vraiment correct (jeton CSRF, templating, CSS, etc).
L'un des avantages, c'est que ça produit un simple fichier binaire que tu peux copier coller sur n'importe quel serveur en ssh, et ça tourne. Pas besoin d'installer 100 packages ou des dépendances dans tous les sens. Juste le binaire et c'est bon.
C'est inspiré de https://astaxie.gitbooks.io/build-web-application-with-golang/en/04.5.html