乘风原创程序

  • Gin 框架快速创建静态文件下载Web服务
  • 2022/1/11 15:39:33
  • 介绍

    本文介绍如何通过 rk-boot 快速搭建静态文件下载 web 服务。

    什么是 静态文件下载 web ui?

    通过配置文件,快速搭建可下载文件的 web 服务。

    请访问如下地址获取完整教程:

    rkdocs.netlify.app/cn

    安装

    go get github.com/rookie-ninja/rk-boot

    快速开始

    rk-boot 提供了一个方便的方法,让用户快速实现网页【浏览和下载】静态文件的功能。

    目前,rk-boot 支持如下文件源。如果用户希望支持更多的文件源,可以通过实现 http.filesystem 接口来实现。

    • 本地文件系统
    • pkger

    1.创建 boot.yaml

    ---
    gin:
      - name: greeter                     # required
        port: 8080                        # required
        enabled: true                     # required
        static:
          enabled: true                   # optional, default: false
          path: "/rk/v1/static"           # optional, default: /rk/v1/static
          sourcetype: local               # required, options: pkger, local
          sourcepath: "."                 # required, full path of source directory

    2.创建 main.go

    // copyright (c) 2021 rookie-ninja
    //
    // use of this source code is governed by an apache-style
    // license that can be found in the license file.
    package main
    
    import (
     "context"
     "github.com/rookie-ninja/rk-boot"
    )
    
    // application entrance.
    func main() {
     // create a new boot instance.
     boot := rkboot.newboot()
    
     // bootstrap
     boot.bootstrap(context.background())
    
     // wait for shutdown sig
     boot.waitforshutdownsig(context.background())
    }

    3.文件夹结构

    .
    ├── boot.yaml
    ├── go.mod
    ├── go.sum
    └── main.go
    
    0 directories, 4 files

    4.验证

    访问 http://localhost:8080/rk/v1/static

    从 pkger 读取文件 (嵌入式静态文件)

    pkger 是一个可以把静态文件,嵌入到 .go 文件的工具。

    这个例子中,我们把当前文件夹下的所有文件,都嵌入到 pkger.go 文件中。

    这样做的好处就是,在部署的时候,可以不用考虑复制一堆文件夹结构。

    1.下载 pkger 命令行

    go get github.com/markbates/pkger/cmd/pkger
    

    2.创建 boot.yaml

    pkger 会使用 module 来区分不同的 package,所以,sourcepath 里,我们添加了相应 module 的前缀。

    ---
    gin:
      - name: greeter                                             # required
        port: 8080                                                # required
        enabled: true                                             # required
        static:
          enabled: true                                           # optional, default: false
          path: "/rk/v1/static"                                   # optional, default: /rk/v1/static
          sourcetype: pkger                                       # required, options: pkger, local
          sourcepath: "github.com/rookie-ninja/rk-demo:/"         # required, full path of source directory

    3.创建 main.go

    代码中,有两个地方需要注意。

    pkger.include("./")
    这段代码不做任何事情,是告诉 pkger 命令行打包哪些文件。

    _ “github.com/rookie-ninja/rk-demo/internal”
    一定要这么引入,因为我们会把 pkger.go 文件放到 internal/pkger.go 中,pkger.go 文件里定一个一个 variable,只有这么引入,才可以在编译 main.go 的时候,顺利引入 variable。

    // copyright (c) 2021 rookie-ninja
    //
    // use of this source code is governed by an apache-style
    // license that can be found in the license file.
    package main
    
    import (
     "context"
     "github.com/markbates/pkger"
     "github.com/rookie-ninja/rk-boot"
     // must be present in order to make pkger load embedded files into memory.
     _ "github.com/rookie-ninja/rk-demo/internal"
    )
    
    func init() {
     // this is used while running pkger cli
     pkger.include("./")
    }
    
    // application entrance.
    func main() {
     // create a new boot instance.
     boot := rkboot.newboot()
    
     // bootstrap
     boot.bootstrap(context.background())
    
     // wait for shutdown sig
     boot.waitforshutdownsig(context.background())
    }

    4.生成 pkger.go

    pkger -o internal
    

    5.文件夹结构

    .
    ├── boot.yaml
    ├── go.mod
    ├── go.sum
    ├── internal
    │   └── pkged.go
    └── main.go
    
    1 directory, 5 files

    6.验证

    访问 http://localhost:8080/rk/v1/static

    自定义文件源

    我们将使用 afero package 里面的 memfs 作为例子。

    如果想要从类似 aws s3 中读取,用户可以实现一个属于自己的 http.filesystem。

    rk-boot 会在后续的更新中,逐渐实现这些功能。

    1.创建 boot.yaml

    ---
    gin:
      - name: greeter                     # required
        port: 8080                        # required
        enabled: true                     # required
    

    2.创建 main.go

    我们在 memfs 中创建了一个 /folder 文件夹和 一个 /file.txt 文件。

    // copyright (c) 2021 rookie-ninja
    //
    // use of this source code is governed by an apache-style
    // license that can be found in the license file.
    package main
    
    import (
     "context"
     "github.com/rookie-ninja/rk-boot"
     "github.com/rookie-ninja/rk-gin/boot"
     "github.com/spf13/afero"
     "os"
    )
    
    // application entrance.
    func main() {
     // create a new boot instance.
     boot := rkboot.newboot()
    
     // create a memory fs
     fs := afero.newhttpfs(afero.newmemmapfs())
    
     // add folder and file.txt into memory fs
     fs.mkdirall("/folder", os.modeperm)
     f, _ := fs.create("/file.txt")
     f.write([]byte("this is my content!"))
     f.close()
    
     // set staticfileentry
     ginentry := boot.getginentry("greeter")
     ginentry.staticfileentry = rkgin.newstaticfilehandlerentry(
      rkgin.withpathstatic("/rk/v1/static"),
      rkgin.withfilesystemstatic(fs))
    
     // bootstrap
     boot.bootstrap(context.background())
    
     // wait for shutdown sig
     boot.waitforshutdownsig(context.background())
    }

    3.验证

    访问 http://localhost:8080/rk/v1/static

    到此这篇关于gin 框架快速创建静态文件下载web服务的文章就介绍到这了,更多相关gin静态文件下载内容请搜索本教程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持本教程网!