Shadow
GO做WEB服务实现文件上传功能
GO做WEB服务实现文件上传功能
直接上代码:
package main
import (
"fmt"
"io"
"log"
"mime/multipart"
"net/http"
"os"
"strconv"
"strings"
"time"
)
//首页
func index(w http.ResponseWriter, r *http.Request) {
_, err := fmt.Fprintln(w, "我是首页")
if err != nil {
log.Fatalln(err)
}
}
//文件上传
func upload(w http.ResponseWriter, r *http.Request) {
//读取表单中提交过来的文件,这个只能上传单个文件,多个请用: r.ParseMultipartForm()
file, fileHeader, err := r.FormFile("img")
if err != nil {
log.Fatalln(err)
return
}
//关闭文件
defer func(file multipart.File) {
err := file.Close()
if err != nil {
log.Fatalln(err)
return
}
}(file)
fmt.Fprintln(w, "文件:", file)
fmt.Fprintln(w, "文件信息:", fileHeader.Header)
fmt.Fprintln(w, "文件名称:", fileHeader.Filename)
//上传的文件路径
var uploadDir string = "./upload/"
//判断文件夹是否存在
_, err = os.Stat(uploadDir)
if err != nil {
//不存在先新建文件夹
err = os.Mkdir(uploadDir, 0666)
if err != nil {
log.Fatalln("文件夹创建失败:", err)
return
}
}
//名称用当前时间戳
fileName := strconv.FormatInt(time.Now().Unix(), 10)
//把文件名和后缀分开,得到的是一个切片
fileNameSlice := strings.Split(fileHeader.Filename, ".")
//获取后缀
fileName = fileName + "." + fileNameSlice[len(fileNameSlice)-1]
//打开一个本地的文件,如果不存则新建,存在则写入,权限为0666
newFile, err := os.OpenFile(uploadDir+fileName, os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
log.Fatalln(err)
return
}
defer func(newFile *os.File) {
err := newFile.Close()
if err != nil {
log.Fatalln(err)
}
}(newFile)
//拷贝上传的文件到刚刚打开的文件上
_, err = io.Copy(newFile, file)
if err != nil {
log.Fatalln(err)
}
fmt.Fprintln(w, "文件"+fileName+"上传成功!")
}
func main() {
http.HandleFunc("/", index)
http.HandleFunc("/upload", upload)
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatalln("服务启动失败")
return
}
}
Dcr163的博客
https://dcr163.cn/637.html(转载时请注明本文出处及文章链接)