如何在Go中创建照片库?

相册是一种显示保存在特定位置的不同图像的方法。用户在此处将不同的图像上传到指定的文件夹中。为了首先显示图像,我们需要读取包含不同图像的目录,然后在读取目录之后逐一显示图像。



main.go

package main

import (
	"crypto/sha1"
	"fmt"
	"html/template"
	"io"
	"log"
	"net/http"
	"os"
	"path/filepath"
	"strings"
)

var tpl *template.Template

func init() {
	tpl = template.Must(template.ParseGlob("templates/*"))
}

func main() {
	http.HandleFunc("/", index)
	http.Handle("/gallery/", http.StripPrefix("/gallery", http.FileServer(http.Dir("./gallery"))))
	http.Handle("/favicon.ico", http.NotFoundHandler())
	http.ListenAndServe(":8080", nil)
}

func index(w http.ResponseWriter, req *http.Request) {
	if req.Method == http.MethodPost {
		mf, fh, err := req.FormFile("nf")
		if err != nil {
			fmt.Println(err)
		}
		defer mf.Close()
		// create sha for file name
		ext := strings.Split(fh.Filename, ".")[1]
		h := sha1.New()
		io.Copy(h, mf)
		fname := fmt.Sprintf("%x", h.Sum(nil)) + "." + ext
		// create new file
		wd, err := os.Getwd()
		if err != nil {
			fmt.Println(err)
		}
		path := filepath.Join(wd, "gallery", fname)
		nf, err := os.Create(path)
		if err != nil {
			fmt.Println(err)
		}
		defer nf.Close()
		mf.Seek(0, 0)
		io.Copy(nf, mf)
	}

	file, err := os.Open("gallery")
	if err != nil {
		log.Fatalf("failed opening directory: %s", err)
	}
	defer file.Close()

	list, _ := file.Readdirnames(0) // 0 to read all files and folders
	tpl.ExecuteTemplate(w, "index.gohtml", list)
}

index.html

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Image Uploader</title>
    <link rel="stylesheet" href="//stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    <script src="//code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
    <script src="//stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
  </head>
  <body>
    <div class="container">
      <h1>Photo Gallery</h1>
      <hr class="mt-2 mb-5">
      <div class="row text-center text-lg-left">
        {{range .}}
        <div class="col-lg-3 col-md-4 col-6">
          <a href="#" class="d-block mb-4 h-100">
          <img class="img-fluid img-thumbnail" src="/gallery/{{.}}">
          </a>
        </div>
        {{end}}
      </div>
      <hr class="mt-2 mb-5">
      <div class="row">
        <div class="col-lg-3 col-md-4 col-6">
          <form method="post" enctype="multipart/form-data">
            <div class="input-group">
              <div class="input-group-prepend">
                <span class="input-group-text" id="inputGroupFileAddon01">Upload</span>
              </div>
              <div class="custom-file">
                <input type="file" class="custom-file-input" name="nf" aria-describedby="inputGroupFileAddon01" id="inputGroupFile01" required> 
                <label class="custom-file-label" for="inputGroupFile01">Choose file</label>	
              </div>
            </div>
            <div class="input-group">
              <div class="custom-file">
                <input type="submit" class="btn btn-primary">
              </div>
            </div>
          </form>
        </div>
      </div>
    </div>
  </body>
</html>

您必须阅读的解决方案

如何设置,获取和列出环境变量?

使用os.Environ列出环境的所有键/值。 os.Environ()以KEY = value的形式返回一片字符串。然后,我们使用strings.Split来获取键和值。然后打印所有键和值。

找出当前进程使用了​​多少个逻辑处理器

NumCPU返回当前进程可用的逻辑CPU数量。

如何使用反射包获取结构变量信息?

使用反射包,您还可以找到结构变量的名称和类型。

如何使用另一个文件golang中的功能?

此示例旨在详细演示函数的各种调用。您将学习在主程序包中创建和调用自定义程序包功能。您还可以使用别名从另一个包中调用自定义包的功能。

获取两个日期[未来和过去]之间的小时,天,分钟和秒的差异

如何修剪字符串的前后空格?

TrimSpace返回字符串s的一部分,并删除了Unicode定义的所有前导和尾随空格。

如何在我们的URL中使用通配符或变量进行复杂的路由?

通过Gorilla Web工具包,大猩猩/多路复用器用于创建灵活的路由,允许正则表达式为路由器指定可用变量。 以下源代码片段显示了在处理程序中带有(非常基本的)正则表达式的缩写程序。 我们将/ pages /之后的任意位数分配给{id:[0-9] +}中名为id的参数。这是我们在pageHandler中确定的值。

Golang函数返回多个值

高朗 中的函数可以返回多个值,这在许多实际情况下都是很有帮助的功能。 本示例声明一个具有两个返回值的函数,然后从主函数调用它。

如何检查指针或接口是否为零?

Golang中的匿名函数

匿名函数是在没有任何命名标识符的情况下声明的函数。就像标准函数一样,匿名函数可以接受输入和返回输出。