Go使用OpenStack-swift对象存储

工作中需要使用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
}

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan阅读 4,128评论 2 7
  • 以下是一个对我很重要的人的简历: 63年,初中毕业,由于家庭原因没有升学。在家务农。 64年,下半年,本人参加县组...
    Sunny857阅读 333评论 1 1
  • 你是一朵莲, 沐浴着虔诚的梵音, 在佛前修行千年; ... 你是一朵莲, 聆听着菩萨的心, 参悟着宝相庄严; .....
    奔奔的果果阅读 3,606评论 92 105
  • 我爱你,你爱他,他不爱你,这是一个互相追逐的故事 你我初次见面 一个女孩出现在了你的生活中,她成为了你的邻居,她爱...
    DOMO3847阅读 412评论 0 0
  • 今天上午老师检查几个人的信,在检查信的时候有几位同学没有的老师非常生气。 我们来到了学校首先我们...
    刘宇晨阅读 177评论 0 1