首頁 > 後端開發 > Golang > 主體

golang實作網站

PHPz
發布: 2023-05-15 09:44:06
原創
763 人瀏覽過

在現今的網路大環境下,人們越來越需要網盤這種雲端儲存的服務。目前市面上普及的雲端儲存服務如百度雲端、微雲、Dropbox等,但是這些服務的隱私、安全性等方面並不太受人們的信任。因此,自己開發一個網盤,成為了越來越受歡迎的選擇。

本文將介紹如何使用Golang開發一個基於Web的網站服務。 Golang是Google開發的一門開源的程式語言,具有高並發、高效能、簡潔易用的特點。使用Golang開發網盤,可以快速搭建穩定、有效率的服務。

一、環境準備

首先,我們需要安裝Golang環境。在安裝完Golang之後,我們需要安裝幾個必要的函式庫:

  • gin : Golang的一個高效能Web框架,用於快速建立RESTful API。
  • gorm : Golang的ORM函式庫,用於方便地操作資料庫。

安裝完畢之後,我們就可以開始愉快的寫程式了。

二、使用Gin框架建立RESTful API

在本專案中,我們使用Gin框架來建立Web服務。 Gin框架簡單易上手,幾乎沒有學習成本。首先建立一個main.go文件,寫如下程式碼:

package main

import "github.com/gin-gonic/gin"

func main() {
  // 创建Gin引擎
  r := gin.Default()

  // 路由
  r.GET("/ping", func(c *gin.Context) {
    c.JSON(200, gin.H{
      "message": "pong",
    })
  })

  // 启动服务
  r.Run()
}
登入後複製

這段程式碼建立了一個Gin引擎,並處理了一個/ping路由。執行程式碼:go run main.go,然後在瀏覽器輸入http://localhost:8080/ping,可以看到輸出結果:{"message":"pong"}。

三、檔案操作

接下來我們需要實作檔案的上傳和下載。文件的上傳和下載都需要先連接到資料庫,訪問對應文件的元信息,然後訪問或下載文件本身。

  1. 檔案元資訊

我們將使用MySQL資料庫儲存檔案元信息,包括檔案名稱、檔案大小、上傳時間、檔案在磁碟上的儲存路徑等。在本專案中,我們使用Gorm函式庫連接MySQL資料庫。在main.go中加入以下程式碼:

import (
  "fmt"

  "github.com/jinzhu/gorm"
  _ "github.com/jinzhu/gorm/dialects/mysql"
)

type File struct {
  ID      uint   `gorm:"primary_key"`
  Name    string `gorm:"type:varchar(255)"`
  Size    int64
  Path    string `gorm:"type:varchar(255)"`
  CreatedAt time.Time
}

var db *gorm.DB
var err error

func init() {
  db, err = gorm.Open("mysql", "root:password@/filestore?charset=utf8&parseTime=True&loc=Local")
  if err != nil {
    fmt.Println("连接数据库失败:", err.Error())
    return
  }

  db.AutoMigrate(&File{})
}
登入後複製

上面的程式碼建立了一個File結構體,該結構體對應資料庫中的一個表。然後使用gorm.Open連接MySQL資料庫,並使用AutoMigrate指令在資料庫中自動建立名為「files」的表。

  1. 檔案上傳

在Gin框架中,使用Post方法可以上傳檔案。我們需要在路由之前添加如下程式碼來開啟上傳文件的中間件:

r.Static("/static", "./static")
r.POST("/upload", func(c *gin.Context) {
  file, header, err := c.Request.FormFile("file")
  if err != nil {
    c.JSON(http.StatusBadRequest, gin.H{
      "msg": err.Error(),
    })
    return
  }
  defer file.Close()

  // 保存文件到本地
  filename := header.Filename
  filepath := fmt.Sprintf("./static/%s", filename)
  err = c.SaveUploadedFile(header, filepath)
  if err != nil {
    c.JSON(http.StatusInternalServerError, gin.H{
      "msg": err.Error(),
    })
      return
  }

  // 将文件元信息存入数据库
  size := header.Size
  f := File{
    Name:    filename,
    Size:    size,
    Path:    filepath,
    CreatedAt: time.Now(),
  }
  _,err = f.InsertFile()
  if err !=nil{
    c.JSON(http.StatusInternalServerError, gin.H{
        "msg": err.Error(),
    })
    return
  }
  c.JSON(http.StatusOK, gin.H{
    "msg": "Upload successful",
  })
})
登入後複製

在上面的程式碼中,我們成功地從Request的Form中取得到上傳文件,然後將檔案儲存到我們的伺服器上。之後,我們將文件元資訊存入資料庫,其中InsertFile()是我們在後面建立的資料庫操作函數。

  1. 檔案下載

我們寫一個簡單的下載函數,用來輸出檔案內容到HTTP回應中,讓客戶端下載。完整程式碼如下:

func (file File) GetFile() (err error) {
  //打开文件并读取文件内容
  f, err := os.Open(file.Path)
  if err != nil {
      return
  }
  defer f.Close()

  w := bufio.NewWriter(file)

  b := make([]byte, 100)
  n := 0
  for {
      n, err = f.Read(b)
      if err != nil && err != io.EOF{
          return
      }
      w.Write(b[:n])
      if n == 0{
          break
      }
  }
  w.Flush()
  return
}

r.GET("/download", func(c *gin.Context) {
  fileName := c.Query("name")
  if len(fileName) == 0 {
    c.JSON(http.StatusBadRequest, gin.H{
      "msg": "invalid parameter",
    })
    return
  }

  file := File{
    Name: fileName,
  }
  err = file.GetFile()
  if err !=nil{
    c.JSON(http.StatusInternalServerError, gin.H{
      "msg": err.Error(),
    })
    return
  }
  c.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment;filename=%s", fileName))
  c.Writer.Header().Add("Content-Type", "application/octet-stream")
  c.File(file.Path)
})
登入後複製

四、儲存最佳化

在一個高並發的環境中,檔案上傳和下載必須是高效的。因此,我們可以使用分散式儲存來優化這個問題。 CDN加速、物件儲存等方式都可以使用。

五、完整程式碼

接下來,我們將在Git上託管完整的程式碼。

建立專案目錄,然後在終端機執行下列指令:

git init
echo "# fileServer" >> README.md
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:username/fileServer.git
git push -u origin master

完整的程式碼請參考:https: //github.com/username/fileServer。

附註:其中username替換為您的GitHub使用者名稱。

六、總結

本文主要介紹如何使用Golang開發一個基於Web的網站服務。透過本文,我們可以了解Gin框架、Gorm函式庫、MySQL資料庫的基本使用方法,以及檔案上傳和下載等操作的實作方式。本文提供的完整程式碼可以幫助讀者更好地理解本文所述的內容,並在實際應用中有所幫助。

以上是golang實作網站的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板