美文网首页go
golang上传图片然后查看图片

golang上传图片然后查看图片

作者: 达摩君 | 来源:发表于2018-05-13 13:57 被阅读82次

    想搞一个自己管理图片的后台,下面分享的是单张图片上传。不得不吐槽golang的资料好少啊~

    import (
        "net/http"
        "html/template"
        "go_api/utils"
        "fmt"
        "go_api/data"
        "os"
        "io"
        "strings"
        "io/ioutil"
    )
    
    func SaveImage(w http.ResponseWriter, r *http.Request)  {
        t, err := template.ParseFiles(utils.SYSTEM_PATH + "/webgo/src/go_api/html/common/uploadImg.html")
        if err != nil {
            utils.Danger(err, "模板有错")
            return
        }
        t.Execute(w, nil)
    }
    
    const UPLOAD_PATH string = utils.SYSTEM_PATH + "/imgs/"
    
    func UploadImage(w http.ResponseWriter, r *http.Request) {
        var img data.Image
        r.ParseMultipartForm(1024)
        imgFile, imgHead, imgErr := r.FormFile("img")
        if imgErr != nil {
             fmt.Println(imgErr)
             return
        }
        defer imgFile.Close()
    
        img.Imageurl = imgHead.Filename
        image, err := os.Create(UPLOAD_PATH + img.Imageurl)
        if err != nil {
            fmt.Println(err)
            return
        }
        defer image.Close()
    
        _, err = io.Copy(image, imgFile)
        if err != nil {
            fmt.Println(err)
            return
        }
    
        err = img.Create()
        if err != nil {
            utils.Danger(err, "插入图片失败")
            fmt.Fprintf(w,"%s,%s",err,"上传失败")
            return
        }
        fmt.Fprintf(w,"上传成功: www.ljbniubi.top/img/look/%s",imgHead.Filename)
    }
    //查看图片
    func LookImg(w http.ResponseWriter, r *http.Request)  {
        fmt.Printf(r.URL.Scheme,r.URL.User)
        path := strings.Split(r.URL.Path,"/")
        var name string
        if len(path) > 1 {
            name = path[len(path) - 1]
        } else {
            name = "null.png"
        }
        fmt.Printf(name)
        w.Header().Set("Content-Type", "image/png")
        w.Header().Set("Content-Disposition",fmt.Sprintf("inline; filename=\"%s\"",name))
    
        file, err := ioutil.ReadFile(UPLOAD_PATH + name)
        if err != nil {
            fmt.Fprintf(w,"查无此图片")
            return
        }
        w.Write(file)
    }
    

    记录坑点:

    • 1.由于是自己玩玩的,所以存放图片的文件夹写死了,只放在一个文件夹里。数据库建好了,但感觉没有直接在文件夹查找直接。当然图片量大的话,就利用数据库存地址,多个文件分开存储吧~
    • 2.template.ParseFiles的路径问题真的是困扰了好久,我在本地测试的时候可以,发布到服务器又报找不到路径。
      Golang的相对路径是相对于执行命令时的目录
    //返回当前的绝对路径
    func GetCurrPath() string {
        file, _ := exec.LookPath(os.Args[0])
        path, _ := filepath.Abs(file)
        index := strings.LastIndex(path, string(os.PathSeparator))
        ret := path[:index]
        return ret
    }
    
    • 3.go-sql-driver/mysql/utils.go:81: undefined: cloneTLSConfig
      google后发现是golang的版本太低了,升级版本就好。
      sudo apt-get install golang-go 但提示已经是最新版本了。解决方案
    $ sudo add-apt-repository ppa:gophers/archive
    $ sudo apt-get update
    $ sudo apt-get install golang-1.10-go
    
    • 4.命令行删除文件夹
    -r 就是向下递归,不管有多少级目录,一并删除
    -f 就是直接强行删除,不作任何提示的意思
    
    删除文件夹实例:
    rm -rf /var/log/httpd/access
    将会删除/var/log/httpd/access目录以及其下所有文件、文件夹
    删除文件使用实例:
    rm -f /var/log/httpd/access.log
    将会强制删除/var/log/httpd/access.log这个文件
    
    • 5.设置响应头
      image/png
      响应头信息中的Content-Disposition用于告知浏览器其获取到的文件是需要展示与页面内还是需要作为附件保存到用户本地,如果需要展示在页面内,设置为inline,否则设置为attachemnt,在设置为attachment时还可以额外规定该附件的文件名,更具体的说明,可以在Content-Disposition获得
    • 6.数据库table缩写字母含义
    PK Belongs to primary key 作为主键
    
    NN Not Null 非空
    
    UQ Unique index 不能重复
    
    BIN Is binary column 存放二进制数据的列
    
    UN Unsigned data type 无符号数据类型(需要整数形数据)
    
    ZF Fill up values for that column with 0's if it is numeric 填充0位(例如指定3位小数,整数18就会变成18.000)
    
    AI Auto Incremental 自增长
    

    相关文章

      网友评论

        本文标题:golang上传图片然后查看图片

        本文链接:https://www.haomeiwen.com/subject/opghdftx.html