TypechoJoeTheme

Dcr163的博客

统计

GO做WEB服务实现文件上传功能

2022-04-17
/
0 评论
/
1,668 阅读
/
正在检测是否收录...
04/17

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
    }
}

go上传文件
朗读
赞(0)
版权属于:

Dcr163的博客

本文链接:

https://dcr163.cn/637.html(转载时请注明本文出处及文章链接)

评论 (0)