美文网首页
Go使用OpenStack-swift对象存储

Go使用OpenStack-swift对象存储

作者: 树先生_张 | 来源:发表于2019-10-02 08:53 被阅读0次

    工作中需要使用swift进行文件的上传,在网上搜了一下,感觉对go的使用都不是很友好,这里引用了一个包,进行了二次封装,菜鸟刚用go时间不久,欢迎大神指出问题。
    先说一下我的目录结构。


    目录结构

    Bean.go文件内容

    package SwiftUtils
    
    // 使用结构体(具体咋用的我也不知道,抄的配置MySQL的文件)
    type Sconfig struct {
        Swift *SwiftConfig `json:"Swift"`
    }
    
    // 配置json结构体
    type SwiftConfig struct {
        UserName            string `json:"userName"`
        Password            string `json:"password"`
        IdentityEndpoint    string `json:"IdentityEndpoint"`
        DomainName          string `json:"DomainName"`
        ContainerName       string `json:"containerName"`
    }
    

    config.json配置文件

    {
      "Swift": {
        "userName": "账号",
        "password": "密码",
        "IdentityEndpoint": "http://IP地址:5000/v3",
        "DomainName": "default",
        "ContainerName": "认证的容器"
      }
    }
    

    FeilUtils.go 工具类文件

    package SwiftUtils
    
    
    import (
        "encoding/json"
        "fmt"
        "os"
    )
    
    // 读取json配置文件
    func ReadJsonFile(path string, data interface{}) interface{} {
        fmt.Println("path:", path)
        file, e := os.Open(path)
        if e != nil {
            fmt.Println("ReadJsonFile open json file error:" + e.Error())
            return data
        }
        decoder := json.NewDecoder(file)
        e2 := decoder.Decode(data)
        if e2 != nil {
            fmt.Println("ReadJsonFile json decode error:" + e2.Error())
            return data
        }
        return data
    }
    

    swift.go swift主文件内容

    package SwiftUtils
    
    import (
        "fmt"
        "github.com/gophercloud/gophercloud"
        "github.com/gophercloud/gophercloud/openstack"
        "github.com/gophercloud/gophercloud/openstack/objectstorage/v1/objects"
        "io/ioutil"
        "net/http"
        "strings"
        "time"
    )
    
    
    
    
    
    //操作文件
    func ConnectSwift() (c *gophercloud.ServiceClient)  {
    
        //swift json配置文件
        SwConfig := GetConfig()
    
        //认证
        opts := gophercloud.AuthOptions{
            IdentityEndpoint: SwConfig.Swift.IdentityEndpoint,
            Username:         SwConfig.Swift.UserName,
            Password:         SwConfig.Swift.Password,
            DomainName:       SwConfig.Swift.DomainName,
        }
        provider, err := openstack.AuthenticatedClient(opts)
        if err != nil {
            fmt.Printf("8AuthenticatedClient : %v", err)
            return
        }
        //进行连接
        client, _ := openstack.NewObjectStorageV1(provider, gophercloud.EndpointOpts{
            Type:   "object-store",
            Name:   "swift",
            Region: "RegionOne",
        })
        // 返回连接信息
        return client  // 信息: &{0xc00014c840 http://ip:8080/v1/AUTH_6135fehth38f64853ddsdwrfwwcdc5f98/  object-store  map[]}
    
    }
    
    
    // 查询所有文件
    func QueryFile() (info []string) {
    
        //swift json配置文件
        SwConfig := GetConfig()
    
        containerName := SwConfig.Swift.ContainerName     // 认证容器名(OpenStack认证的容器,新建容器需要进行OpenStack认证)
    
    
        listOpts := objects.ListOpts{
            Full: false,
        }
    
        // 连接信息
        client := ConnectSwift()
    
        allPages, err := objects.List(client, containerName, listOpts).AllPages()
        if err != nil {
            fmt.Println("查询异常: " + err.Error())
        }
    
    
        allObjects, err := objects.ExtractNames(allPages)
        if err != nil {
            fmt.Println("查询异常: " + err.Error())
        }
        url := client.ResourceBaseURL()
    
    
        result := make([]string, 0)
        for _, object := range allObjects {
            url := url + containerName + "/" + object  // 拼接url
            result = append(result, url)  // 把URL添加到数组里
        }
        return result   // 返回数组信息
    
    }
    
    
    // 上传文件
    func UploadFile(r *http.Request) (c []string) {
    
        //swift json配置文件
        SwConfig := GetConfig()
    
        containerName := SwConfig.Swift.ContainerName       // 认证容器名(OpenStack认证的容器,新建容器需要进行OpenStack认证)
    
        client := ConnectSwift()
    
        file, head, err := r.FormFile("file")     // 读取文件
        if err != nil {
            fmt.Println(err)
            fmt.Println(head.Filename)
            return
        }
        defer file.Close()
    
        body, err := ioutil.ReadAll(file)               // 读取请求体信息
        if err != nil{
            fmt.Println("http read error")
        }
        src := string(body)
        Info := objects.CreateOpts{
            ContentType: "text/plain",
            Content: strings.NewReader(src),                // 读取字符串信息
        }
        now := time.Now()
        date := now.Format("20060102150405")            // 格式化时间输出
        name := head.Filename
        fmt.Println(name)
        c = strings.Split(name, ".")
        FileName := date + "." + c[1]
        objects.Create(client,containerName, FileName, Info)    // 上传
        result := QueryFile()                               // 返回查询信息
        return result                                       // 返回查询信息
    
    }
    
    
    
    // 删除文件
    func DeleteFile(FileName string) (s []string) {
    
        //swift json配置文件
        SwConfig := GetConfig()
    
        containerName := SwConfig.Swift.ContainerName     // 认证容器名(OpenStack认证的容器,新建容器需要进行OpenStack认证)
    
        //  连接配置信息
        client := ConnectSwift()
    
        objects.Delete(client, containerName, FileName, nil).Extract()
    
        result := QueryFile()                             // 返回查询信息
        return result                                     // 返回查询信息
    }
    
    
    // 查询单个文件
    func QueryAFile(FileName string) (r string) {
        // 查询单个文件主要用在信息查询上
        result := QueryFile()
    
        for _, r := range result{
            str := r[(strings.LastIndex(r,    `/`)+1):]  // 切片出文件名
    
            if str == FileName{                                 // 当等于文件名的时候进行返回
                return r                                        // 返回查询信息
            }
        }
        return
    }
    

    SwiftConfigManager.go 配置文件初始化

    package SwiftUtils
    
    
    import "flag"
    
    var Swift *Sconfig
    
    // 读取json
    func GetConfig() *Sconfig {
        if Swift == nil {
            Swift = &Sconfig{
                Swift: new(SwiftConfig),
            }
            ReadJsonFile(filePath, Swift)
        }
        return Swift
    
    }
    
    
    var filePath string
    
    // 初始化配置文件
    func init() {
        path := flag.String("path", "./SwiftUtils/config.json", "setting file path")
        flag.Parse()
        filePath = *path
    }
    

    有哪里写的不够清楚,可以直接在评论区说,看到会第一时间进行回复。

    如何使用。
    上传文件的时候:

    func UploadInfo(v3contract V3Contract, r *http.Request) (re BaseResult)  {
        v3contract.ContractDocumentUrl = SwiftUtils.UploadFile(r)   // 直接传入r就行
        re.Result = v3contract.ContractDocumentUrl
        re.Code = SUCCESS
        re.Message = SUCCESS_MESSAGE
        return re
    }
    

    其他使用的方法都是比较简单的直接传入文件名称,就可完成查询,删除操作。

    相关文章

      网友评论

          本文标题:Go使用OpenStack-swift对象存储

          本文链接:https://www.haomeiwen.com/subject/wtaxuctx.html