第023节:文件操作

                           

基础静态文件服务

在Web服务器的开发中,往往会包含很多静态资源文件。我们希望能从浏览器中以http请求的方式直接访问某些资源文件。如果要实现直接访问文件的请求的需求,需要启用静态文件服务。在Iris框架中,我们可以通过Iris提供的方法来打开静态文件服务功能。代码如下所示:

app := iris.New()
app.StaticWeb("/static", "./static")
app.StaticWeb("/manage/static", "./static")
app.StaticWeb("/img", "./static/img")

如上所示,通过StaticWeb方法设置了三个请求url的静态文件服务。StaticWeb方法两个参数:

  • 第一个参数为浏览器中请求的参数

  • 第二个参数为后台服务器端映射访问的静态文件路径
    简单举例来说,例如前端浏览器请求一个静态文件,请求路径为:http://localhost:8080/img/default.png,则当该文件请求到达服务器端时,将会把/img/default.png映射成为/static/default.png,并到后者目录下访问具体的default.png文件,如果文件存在,则能够成功访问;如果文件不存在,则不能正常访问。

  • 第三,iris框架支持StaticWeb方法通过多次调用配置多个静态文件服务目录。

基础单页面文件服务

在Iris框架中,支持基础单页面文件服务,该功能是仅针对设定某个文件的访问时所提供的注册方法。在使用基础单页面文件服务时,需要经过两个步骤

  • 第一步为单页面文件注册,通常为文件扩展名注册
  • 第二步为访问单页面文件,通过View方法。
    在本实际项目中,我们通过如下代码进行实现单页面文件服务的访问:
app.RegisterView(iris.HTML("./static", ".html"))
app.Get("/", func(context context.Context) {
        context.View("index.html")
})
  • 通过RegisterView方法来注册视图引擎,该方法接受参数类型为Engine,Engine为接口类型,如下定义:

    type Engine interface {
       Load() error
       ExecuteWriter(w io.Writer, filename string, layout string, bindingData interface{}) error
       Ext() string
    }

    该Engine接口有提供三个方法,分别是如上的:Load,ExecuteWriter,Ext方法。因为Engine是接口,而我们在进行RegisterView方法调用时,需要传入的是具体的接口实现对象,因此,我们必须要了解知道在iris框架中有几种Engine接口的实现,具体的实现有包含一下几种:

    • HTMLEngine:支持注册Html格式的文件引擎
    • DjangoEngine:支持Python语言的Django框架的引擎,主要是python格式文件。
    • HandlebarsEngine:支持Javascript的模版语言引擎,主要支持的是js文件。
    • Pug:支持后缀为.pug格式的文件。
    • Amber:支持Amber格式的模版引擎。
  • 可以通过context.View方法访问某个已经注册过的模版视图的具体文件,并通过context.ViewData方法为设置页面动态数据。具体如下所示:
    context.ViewData("page", "hello")
    context.View("index.html")

设定应用图标

在Iris框架中,可以通过Favicon方法,通过给定一个文件路径,来设定某个应用的图标。具体使用方法如下所示:

app.Favicon("./static/favicons/favicon.ico")

文件上传

在应用开发中,我们时常需要上传文件,最常见的就是用户头像。因此需要提供文件上传的功能,在本项目实战中,我们通过该功能来开发管理员头像上传功能。分为客户端和服务端两个方面:

  • 客户端

    • 请求url:/admin/update/avatar/1
    • 请求类型:POST
    • 请求Form表单:

      Content-Disposition: form-data; name="file"; filename="bg.jpeg"
      Content-Type: image/jpeg

    我们可以看到,请求的url同普通url请求相同,请求类型为post。Post提交的请求数据为file类型,Content-Type表示传输的类型为image/jpeg。

  • 服务器端
    我们在服务端可以通过编写处理Post处理方法来进行处理文件上传的业务逻辑。编码实现如下:

app.Post("/admin/update/avatar/{adminId}", func(context context.Context) {
        adminId := context.Params().Get("adminId")
        iris.New().Logger().Info(adminId)

        file, info, err := context.FormFile("file")
        if err != nil {
iris.New().Logger().Info(err.Error())
            context.JSON(iris.Map{
                "status":  utils.RECODE_FAIL,
                "type":    utils.RESPMSG_ERROR_PICTUREADD,
                "failure": utils.Recode2Text(utils.RESPMSG_ERROR_PICTUREADD),
            })
            return
        }
        defer file.Close()
        fname := info.Filename
        out, err := os.OpenFile("./uploads/"+fname, os.O_WRONLY|os.O_CREATE, 0666)
        if err != nil {
            iris.New().Logger().Info(err.Error())
            context.JSON(iris.Map{
                "status":  utils.RECODE_FAIL,
                "type":    utils.RESPMSG_ERROR_PICTUREADD,
                "failure": utils.Recode2Text(utils.RESPMSG_ERROR_PICTUREADD),
            })
            return
        }
        defer out.Close()
        _, err = io.Copy(out, file)
        if err != nil {
            context.JSON(iris.Map{
                "status":  utils.RECODE_FAIL,
                "type":    utils.RESPMSG_ERROR_PICTUREADD,
                "failure": utils.Recode2Text(utils.RESPMSG_ERROR_PICTUREADD),
            })
            return
        }
        intAdminId, _ := strconv.Atoi(adminId)
        adminService.SaveAvatarImg(int64(intAdminId), fname)
        context.JSON(iris.Map{
            "status":     utils.RECODE_OK,
            "image_path": file,
        })
    })

文件下载

文件下载操作在Iris框架中很简单,就只需要一句代码,即可完成:

app = iris.New()
file := "./files/first.zip"
app.SendFile(file,"hello.zip")

原创文章,Golang中国出品,文章对应源码下载:https://www.qfgolang.com/?page_id=1973

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

学习交流群:点击这里给我发消息

QR code