go gin增删改查上传文件下载文件

一、依赖

module main

go 1.15

require (
	github.com/gin-contrib/static v0.0.0-20200916080430-d45d9a37d28e
	github.com/gin-gonic/gin v1.6.3
	github.com/go-playground/validator/v10 v10.3.0 // indirect
	github.com/golang/protobuf v1.4.2 // indirect
	github.com/jinzhu/gorm v1.9.16
	github.com/json-iterator/go v1.1.10 // indirect
	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
	github.com/modern-go/reflect2 v1.0.1 // indirect
	github.com/ugorji/go v1.1.8 // indirect
	golang.org/x/sys v0.0.0-20200918174421-af09f7315aff // indirect
	google.golang.org/protobuf v1.25.0 // indirect
	gopkg.in/yaml.v2 v2.3.0 // indirect
)

二、代码

package main

// import _ "github.com/jinzhu/gorm/dialects/postgres"
// import _ "github.com/jinzhu/gorm/dialects/sqlite"
// import _ "github.com/jinzhu/gorm/dialects/mssql"
//国内镜像 https://learnku.com/go/wikis/38122
import (
	"bytes"
	"fmt"
	"io"
	"io/ioutil"
	"log"
	"net/http"
	"os"
	"time"

	"github.com/gin-gonic/gin"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

//变量
var (
	Database *gorm.DB
)

//变量
var _ = log.Printf

type Book struct {
    
    
	ID   int    // 列名为 `id`
	Name string `gorm:"size:255"` // 列名为 `name`
	Port int    // 列名为 `port`
}

func init() {
    
    
	//创建一个数据库的连接
	var err error
	db, err := gorm.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8")
	db.SingularTable(true)
	if err != nil {
    
    
		panic("failed to connect database")
	}
	//迁移the schema
	db.AutoMigrate(&Book{
    
    })
	Database = db
}

//启动
func main() {
    
    
	router := gin.Default()
	router.POST("/book", creatBook)
	router.GET("/books", fetchAllBooks)
	router.GET("/book/:id", updateBook)
	router.PUT("/book/:id", fetchSingleBook)
	router.DELETE("/book/:id", deleteBook)
	router.POST("/upload_file", HandleUploadFile)
	router.POST("/upload_muti_file", HandleUploadMutiFile)
	router.GET("/download", HandleDownloadFile)
	router.GET("/getUrl", Get)
	router.Run(":7001")
}

// 查询所有
func fetchAllBooks(c *gin.Context) {
    
    
	var dataList []Book
	Database.Find(&dataList)
	if len(dataList) <= 0 {
    
    
		c.JSON(http.StatusNotFound, gin.H{
    
    "status": -1, "result": nil, "message": "No todo found!"})
		return
	}
	c.JSON(200, gin.H{
    
    "status": 1, "result": dataList, "message": "Success"})
}

//查询
func fetchSingleBook(c *gin.Context) {
    
    
	var data Book
	id := c.Param("id")
	Database.First(&data, id)
	err := c.ShouldBind(&data)
	if err != nil {
    
    
		c.JSON(200, gin.H{
    
    "status": -1, "result": nil, "message": err.Error()})
	} else {
    
    
		if data.ID == 0 {
    
    
			c.JSON(http.StatusNotFound, gin.H{
    
    "status": http.StatusNotFound, "result": nil, "message": "No todo found!"})
			return
		}
		Database.Model(&data).Updates(&data)
		c.JSON(200, gin.H{
    
    "status": 1, "result": data, "message": "Success"})
	}

}

//更新
func updateBook(c *gin.Context) {
    
    
	var data Book
	id := c.Param("id")
	Database.First(&data, id)
	if data.ID == 0 {
    
    
		c.JSON(http.StatusNotFound, gin.H{
    
    "status": http.StatusNotFound, "result": nil, "message": "No todo found!"})
		return
	}
	Database.Model(&data).Updates(&data)
	c.JSON(200, gin.H{
    
    "status": 1, "result": data, "message": "Success"})
}

//创建
func creatBook(c *gin.Context) {
    
    
	var book Book
	err := c.ShouldBind(&book)
	if err != nil {
    
    
		c.JSON(200, gin.H{
    
    "status": -1, "result": nil, "message": err.Error()})
	} else {
    
    
		Database.Save(&book)
		c.JSON(200, gin.H{
    
    "status": 1, "result": book, "message": "Success"})
	}
}

//删除
func deleteBook(c *gin.Context) {
    
    
	var data Book
	todoID := c.Param("id")
	Database.First(&data, todoID)
	if data.ID == 0 {
    
    
		c.JSON(http.StatusNotFound, gin.H{
    
    "status": http.StatusNotFound, "message": "No todo found!"})
		return
	}
	Database.Delete(&data)
	c.JSON(200, gin.H{
    
    "status": 1, "result": data, "message": "Success"})
}

//错误
func handleError(err error) {
    
    
	fmt.Println("Error:", err)
	os.Exit(-1)
}

// 发送GET请求
// url:         请求地址
// response:    请求返回的内容
func Get(c *gin.Context) {
    
    
	url := c.Param("url")
	// 超时时间:5秒
	client := &http.Client{
    
    Timeout: 5 * time.Second}
	resp, err := client.Get(url)
	if err != nil {
    
    
		panic(err)
	}
	defer resp.Body.Close()
	var buffer [512]byte
	result := bytes.NewBuffer(nil)
	for {
    
    
		n, err := resp.Body.Read(buffer[0:])
		result.Write(buffer[0:n])
		if err != nil && err == io.EOF {
    
    
			break
		} else if err != nil {
    
    
			panic(err)
		}
	}
	c.JSON(200, gin.H{
    
    "status": 1, "result": result.String(), "message": "Success"})
}

// HandleUploadFile 上传单个文件
func HandleUploadFile(c *gin.Context) {
    
    
	file, header, err := c.Request.FormFile("file")
	if err != nil {
    
    
		c.JSON(http.StatusBadRequest, gin.H{
    
    "msg": "文件上传失败"})
		return
	}
	content, err := ioutil.ReadAll(file)
	if err != nil {
    
    
		c.JSON(http.StatusBadRequest, gin.H{
    
    "msg": "文件读取失败"})
		return
	}
	fmt.Println(header.Filename)
	fmt.Println(string(content))
	c.JSON(http.StatusOK, gin.H{
    
    "msg": "上传成功"})
}

// HandleUploadMutiFile 上传多个文件
func HandleUploadMutiFile(c *gin.Context) {
    
    
	// 限制上传文件大小
	c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, 4<<20)
	// 限制放入内存的文件大小
	err := c.Request.ParseMultipartForm(4 << 20)
	if err != nil {
    
    
		c.JSON(http.StatusBadRequest, gin.H{
    
    "msg": "文件读取失败"})
		return
	}
	formdata := c.Request.MultipartForm
	files := formdata.File["file"]
	for _, v := range files {
    
    
		file, err := v.Open()
		if err != nil {
    
    
			c.JSON(http.StatusBadRequest, gin.H{
    
    "msg": "文件读取失败"})
			return
		}
		defer file.Close()

		content, err := ioutil.ReadAll(file)
		if err != nil {
    
    
			c.JSON(http.StatusBadRequest, gin.H{
    
    "msg": "文件读取失败"})
			return
		}
		fmt.Println(v.Filename)
		fmt.Println(string(content))
	}
	c.JSON(http.StatusOK, gin.H{
    
    "msg": "上传成功"})
}

// HandleDownloadFile 下载文件
func HandleDownloadFile(c *gin.Context) {
    
    
	content := c.Query("content")
	content = "hello world, 我是一个文件," + content
	c.Writer.WriteHeader(http.StatusOK)
	c.Header("Content-Disposition", "attachment; filename=hello.txt")
	c.Header("Content-Type", "application/text/plain")
	c.Header("Accept-Length", fmt.Sprintf("%d", len(content)))
	c.Writer.Write([]byte(content))
}

三、sql脚本

DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `port` int(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

猜你喜欢

转载自blog.csdn.net/qq_32447301/article/details/108721254