首頁  >  文章  >  後端開發  >  golang網盤搭建

golang網盤搭建

PHPz
PHPz原創
2023-05-15 10:59:37839瀏覽

隨著網路的發展,網盤的需求越來越大,但是市面上的網盤產品頻頻被投訴隱私洩露等問題,因此,搭建一個屬於自己的網盤已經成為了一個趨勢。本文將介紹如何使用golang搭建一個簡單的網盤。

1.環境準備

使用golang搭建網盤需要具備一定的程式設計能力,以及以下環境準備:

1.1 必要的工具

  • go >= 1.8
  • godep
  • git

#1.2 依賴函式庫

  • golang.org/x/crypto: Go語言內建加密包之外,提供更多的安全加密演算法支持,包括SHA256/384/512、RC4、DES、AES等等。
  • github.com/gin-gonic/gin: 高效能 HTTP 框架,可用於快速編寫簡單的 Web 應用,以及更複雜的應用程式。
  • github.com/go-xorm/core: 輕量級 ORM 框架,用於對資料庫進行 CRUD 操作。
  • github.com/go-xorm/xorm: 基於core包的增強版,提供了簡化sql生成,事務,緩存以及多種數據源訪問等等,適用於各類大小項目的數據訪問層。

2.專案架構

網盤後端是一個檔案管理系統,將檔案讀取到記憶體中,由HTTP 伺服器提供存取服務,前端透過簡單的HTML/ CSS/JS 頁面實現互動。在開發過程中,我們嚴格遵循 MVC 設計模式,分離出 Model、View、Controller 三個層次。

2.1 Model層

Model 層主要是負責資料訪問,將資料從底層資料儲存中提取出來,然後提供給 Controller 層進行業務處理。在我們的系統裡,主要是對檔案進行 CURD 操作。我們使用 ORM 框架 xorm 對底層資料進行抽象,提供更簡單明了的 API。

資料模型的定義採用Go 語言結構體,如下:

type User struct {
    Id int64
    Username string `xorm:"unique"`
    Password string
}

2.2 View層

View 層對應Web 應用程式中的Presentation 層,主要負責將控制層傳回的資料將渲染到程式介面上,並將介面發送的請求資料傳遞給控制層進行處理。在我們的系統裡,View 層主要是負責處理前端頁面對接。

我們採用 Gin 框架來實作 View 層程式碼的編寫。首先,我們需要設定一個路由管理,當我們進入某一個 URL 時,自動呼叫對應的處理函數進行處理。在 Gin 框架中,這個非常容易實現:

router := gin.Default()
router.GET("/files", handlers.ListFiles)
router.PUT("/files/:name", handlers.AddFile)
router.POST("/files/:name", handlers.UpdateFile)
router.DELETE("/files/:name", handlers.DeleteFile)
router.Run(":8020")

2.3 Controller層

Controller 層負責處理請求,將資料拿到 View 層,最終將處理結果傳回。在我們的系統裡,Controller 層主要是負責業務邏輯的處理。

處理過程中,我們首先要判斷使用者是否為登入狀態,如果沒有登錄,則跳到登入頁面,否則跳到檔案清單。同樣的,當使用者請求文件的時候,我們需要先檢查文件是否存在,如果不存在,則傳回 404 錯誤頁面。

3.檔案操作

3.1 檔案上傳

在檔案上傳前,我們首先要對檔案進行類型檢查。為了防止透過分析 HTTP 套件來篡改檔案類型,我們建議在前端進行類型檢查。我們使用 JavaScript 的 FileReader 物件讀取上傳文件,並封鎖了 AJAX 請求。

當使用者選擇好上傳文件時,我們會開始非同步讀取文件,讀取完成後,將文件以二進位方式上傳至伺服器。上傳成功後,將文件資訊儲存在資料庫中方便管理。

3.2 檔案下載

當請求下載檔案時,我們使用 HTTP 服務直接將檔案以串流的形式傳回瀏覽器。同時,我們使用 http.ServeContent 函數傳輸文件,並保證文件傳輸完全正確且可控。

func (h Handler) DownloadFile(c gin.Context) {

fileName := c.Param("name")
filePath := h.filePath(fileName)
if _, err := os.Stat(filePath); os.IsNotExist(err) {
    c.String(http.StatusNotFound, "file not exist")
    return
}
c.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", fileName))
c.Writer.Header().Add("Content-Type", getContentType(fileName))
http.ServeFile(c.Writer, c.Request, filePath)

}

3.3 檔案刪除

#檔案刪除是一個比較簡單的操作。首先,我們需要檢查文件是否存在,如果不存在,則傳回錯誤訊息。然後,我們需要從資料庫中刪除文件訊息,最後將文件從磁碟上刪除。

func (h Handler) DeleteFile(c gin.Context) {

fileName := c.Param("name")
filePath := h.filePath(fileName)
if _, err := os.Stat(filePath); os.IsNotExist(err) {
    c.String(http.StatusNotFound, "file not exist")
    return
}
session := h.engine.NewSession()
defer session.Close()
if err := session.Begin(); err != nil {
    log.Printf("begin transaction failed: %s", err.Error())
    c.String(http.StatusInternalServerError, err.Error())
    return

}
if _, err := session.Delete(&File{FileName: fileName}); err != nil {
    session.Rollback()
    c.String(http.StatusInternalServerError, err.Error())
    return
}
if err := session.Commit(); err != nil {
    c.String(http.StatusInternalServerError, err.Error())
    return
}
if err := os.Remove(filePath); err != nil {
    c.String(http.StatusInternalServerError, err.Error())
    return
}
c.Header("Access-Control-Allow-Origin", "*")

c.String(http.StatusOK, "file delete success")

}

4.安全性原則

為了提高網盤系統的安全性,我們在開發過程中應該嚴格遵循以下安全策略:

4.1 權限控制

只允許授權使用者使用系統的各項功能,其他使用者無法存取和修改數據。

4.2 資料加密

所有敏感資訊都應該進行加密處理,避免資訊在傳輸和預存程序中遭到竊取、竄改等安全性事件。

4.3 防範網路攻擊

系統需要採用有效的防範措施,避免來自網路的攻擊,包括但不限於防火牆、防毒軟體等。

5.總結

透過本文,我們了解如何使用 golang 建立一個簡單的網站系統。在開發過程中,我們嚴格遵循了 MVC 設計模式,將模組分離,並提高了品質和可維護性。另外,我們在系統安全性方面進行了嚴格考慮,避免了一些常見的安全問題,並提高了網盤系統的可靠性和安全性。我們相信,對於剛入門 golang 程式設計的人員,本文能夠幫助他們更好地理解 golang 的應用場景,並快速上手完成專案開發。

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn