使用golang怎么实现一个文件上传服务,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
package main
import (
"encoding/json"
"io"
"math/rand"
"net/http"
"os"
"strconv"
"strings"
"time"
)
const POS = "."
const DIR = "/"
const PATH = "image"
const HTTP = "https://www.image.com"
func getFileName(ext string) string {
random := rand.New(rand.NewSource(time.Now().UnixNano()))
datetime := time.Now().Format("200612")
dstPath := PATH + DIR + datetime
dstFile := dstPath + DIR + datetime + strconv.Itoa(random.Int()) + POS + strings.Replace(ext, DIR, POS, 1)
_, err := os.Stat(dstPath)
res := os.IsNotExist(err)
if res == true {
os.MkdirAll(dstPath, os.ModePerm)
}
return dstFile
}
func uploadFile(w http.ResponseWriter, r *http.Request) {
r.ParseMultipartForm(10 << 20)
file, handler, err := r.FormFile("myFile")
if err != nil {
w.WriteHeader(500)
return
}
defer file.Close()
fileName := getFileName(handler.Header.Get("Content-Type"))
fp, err := os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
if err != nil {
w.WriteHeader(500)
return
}
defer fp.Close()
size, err := io.Copy(fp, file)
if err != nil {
w.WriteHeader(500)
return
}
go callUploadResult(w, fileName, size)
}
func callUploadResult(w http.ResponseWriter, fileName string, size int64) {
var list = make(map[string]string)
list["image"] = HTTP + DIR + fileName
list["size"] = strconv.FormatInt(size/1024, 10) + "KB"
list["action"] = "call-upload-result"
jsonStr, _ := json.Marshal(list)
w.Header().Set("Content-Type", "application/json")
w.Write([]byte(jsonStr))
}
func main() {
http.HandleFunc("/upload", uploadFile)
http.ListenAndServe("127.0.0.1:8090", nil)
}
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/andyhua/blog/3073209