美文网首页
go语言编程 许世伟简单的相册web程序

go语言编程 许世伟简单的相册web程序

作者: 深夜独行侠 | 来源:发表于2017-06-16 10:02 被阅读0次

1创建phtoweb目录 在目录下创建 uploads 目录

phtoweb.go:

package main

import (

"html/template"

"io"

"io/ioutil"

"log"

"net/http"

"os"

"path"

"runtime/debug"

)

const (

ListDir      = 0x0001

UPLOAD_DIR  = "./uploads"

TEMPLATE_DIR = "./views"

)

var templates = make(map[string]*template.Template)

func init() {

fileInfoArr, err := ioutil.ReadDir(TEMPLATE_DIR)

check(err)

var templateName, templatePath string

for _, fileInfo := range fileInfoArr {

templateName = fileInfo.Name()

if ext := path.Ext(templateName); ext != ".html" {

continue

}

templatePath = TEMPLATE_DIR + "/" + templateName

log.Println("Loading template:", templatePath)

t := template.Must(template.ParseFiles(templatePath))

templates[templateName] = t

}

}

func check(err error) {

if err != nil {

panic(err)

}

}

func renderHtml(w http.ResponseWriter, tmpl string, locals map[string]interface{}) {

tmpl += ".html"

err := templates[tmpl].Execute(w, locals)

check(err)

}

func isExists(path string) bool {

_, err := os.Stat(path)

if err == nil {

return true

}

return os.IsExist(err)

}

func uploadHandler(w http.ResponseWriter, r *http.Request) {

if r.Method == "GET" {

renderHtml(w, "upload", nil)

}

if r.Method == "POST" {

f, h, err := r.FormFile("image")

check(err)

filename := h.Filename

defer f.Close()

t, err := os.Create(UPLOAD_DIR + "/" + filename)

check(err)

defer t.Close()

_, err = io.Copy(t, f)

check(err)

http.Redirect(w, r, "/view?id="+filename, http.StatusFound)

}

}

func viewHandler(w http.ResponseWriter, r *http.Request) {

imageId := r.FormValue("id")

imagePath := UPLOAD_DIR + "/" + imageId

if ok := isExists(imagePath); !ok {

http.NotFound(w, r)

return

}

w.Header().Set("Content-Type", "image")

http.ServeFile(w, r, imagePath)

}

func listHandler(w http.ResponseWriter, r *http.Request) {

fileInfoArr, err := ioutil.ReadDir("./uploads")

check(err)

locals := make(map[string]interface{})

images := []string{}

for _, fileInfo := range fileInfoArr {

images = append(images, fileInfo.Name())

}

locals["images"] = images

renderHtml(w, "list", locals)

}

func safeHandler(fn http.HandlerFunc) http.HandlerFunc {

return func(w http.ResponseWriter, r *http.Request) {

defer func() {

if e, ok := recover().(error); ok {

http.Error(w, e.Error(), http.StatusInternalServerError)

// 或者输出自定义的 50x 错误页面

// w.WriteHeader(http.StatusInternalServerError)

// renderHtml(w, "error", e.Error())

// logging

log.Println("WARN: panic fired in %v.panic - %v", fn, e)

log.Println(string(debug.Stack()))

}

}()

fn(w, r)

}

}

func staticDirHandler(mux *http.ServeMux, prefix string, staticDir string, flags int) {

mux.HandleFunc(prefix, func(w http.ResponseWriter, r *http.Request) {

file := staticDir + r.URL.Path[len(prefix)-1:]

if (flags & ListDir) == 0 {

fi, err := os.Stat(file)

if err != nil || fi.IsDir() {

http.NotFound(w, r)

return

}

}

http.ServeFile(w, r, file)

})

}

func main() {

mux := http.NewServeMux()

staticDirHandler(mux, "/assets/", "./public", 0)

mux.HandleFunc("/", safeHandler(listHandler))

mux.HandleFunc("/view", safeHandler(viewHandler))

mux.HandleFunc("/upload", safeHandler(uploadHandler))

err := http.ListenAndServe(":8080", mux)

if err != nil {

log.Fatal("ListenAndServe: ", err.Error())

}

}

相关文章

  • go语言编程 许世伟简单的相册web程序

    1创建phtoweb目录 在目录下创建 uploads 目录 phtoweb.go: package main i...

  • 第一篇:为什么要学习Go语言?

    学习书籍--许式伟、吕桂华等编著《Go语言编程》 目录 一、几种语言的理解 二、为什么要学习Go语言?(Go语言最...

  • 《Go语言圣经》第一章笔记

    《Go语言圣经(中文版)》是《The Go Programming Language》的翻译版本,估计是许世伟早期...

  • Go web 教程

    Go Web 新手教程 大家好,我叫谢伟,是一名程序员。 web 应用程序是一个各种编程语言一个非常流行的应用领域...

  • go语言之函数定义案例

    执行 结果是 许世伟《go语言编程》42页的案例,今天录制了一期有关go函数的教程,之后会上传到哔哩哔哩和Yout...

  • Go Web编程.epub

    【下载地址】 《Go Web编程》介绍如何用Go语言进行Web应用的开发,将Go语言的特性与Web开发实战组合到一...

  • 一个Go语言程序示例

    本文档介绍来自《Go语言编程》的简单Go语言程序示例。 程序结构 本程序是一个排序算法的实现,程序结构如下所示 创...

  • Go 语言结构

    在我们开始学习 Go 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构。 -Go Hello ...

  • Go 语言结构

    在我们开始学习 Go 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构。 Go Hello W...

  • Go语言并发详解

    有人把Go比作21世纪的C语言,第一是因为Go语言设计简单,第二,21世纪最重要的就是并行程序设计,而Go从语言层...

网友评论

      本文标题:go语言编程 许世伟简单的相册web程序

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