Go使用OpenStack-swift對(duì)象存儲(chǔ)

工作中需要使用swift進(jìn)行文件的上傳,在網(wǎng)上搜了一下航瞭,感覺對(duì)go的使用都不是很友好诫硕,這里引用了一個(gè)包,進(jìn)行了二次封裝刊侯,菜鳥剛用go時(shí)間不久章办,歡迎大神指出問題。
先說一下我的目錄結(jié)構(gòu)滨彻。


目錄結(jié)構(gòu)

Bean.go文件內(nèi)容

package SwiftUtils

// 使用結(jié)構(gòu)體(具體咋用的我也不知道藕届,抄的配置MySQL的文件)
type Sconfig struct {
    Swift *SwiftConfig `json:"Swift"`
}

// 配置json結(jié)構(gòu)體
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": "賬號(hào)",
    "password": "密碼",
    "IdentityEndpoint": "http://IP地址:5000/v3",
    "DomainName": "default",
    "ContainerName": "認(rèn)證的容器"
  }
}

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主文件內(nèi)容

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()

    //認(rèn)證
    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
    }
    //進(jìn)行連接
    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     // 認(rèn)證容器名(OpenStack認(rèn)證的容器,新建容器需要進(jìn)行OpenStack認(rèn)證)


    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添加到數(shù)組里
    }
    return result   // 返回?cái)?shù)組信息

}


// 上傳文件
func UploadFile(r *http.Request) (c []string) {

    //swift json配置文件
    SwConfig := GetConfig()

    containerName := SwConfig.Swift.ContainerName       // 認(rèn)證容器名(OpenStack認(rèn)證的容器亭饵,新建容器需要進(jìn)行OpenStack認(rèn)證)

    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)               // 讀取請(qǐng)求體信息
    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")            // 格式化時(shí)間輸出
    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     // 認(rèn)證容器名(OpenStack認(rèn)證的容器休偶,新建容器需要進(jìn)行OpenStack認(rèn)證)

    //  連接配置信息
    client := ConnectSwift()

    objects.Delete(client, containerName, FileName, nil).Extract()

    result := QueryFile()                             // 返回查詢信息
    return result                                     // 返回查詢信息
}


// 查詢單個(gè)文件
func QueryAFile(FileName string) (r string) {
    // 查詢單個(gè)文件主要用在信息查詢上
    result := QueryFile()

    for _, r := range result{
        str := r[(strings.LastIndex(r,    `/`)+1):]  // 切片出文件名

        if str == FileName{                                 // 當(dāng)?shù)扔谖募臅r(shí)候進(jìn)行返回
            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
}

有哪里寫的不夠清楚,可以直接在評(píng)論區(qū)說辜羊,看到會(huì)第一時(shí)間進(jìn)行回復(fù)踏兜。

如何使用词顾。
上傳文件的時(shí)候:

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
}

其他使用的方法都是比較簡單的直接傳入文件名稱,就可完成查詢碱妆,刪除操作肉盹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市疹尾,隨后出現(xiàn)的幾起案子上忍,更是在濱河造成了極大的恐慌,老刑警劉巖纳本,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窍蓝,死亡現(xiàn)場離奇詭異,居然都是意外死亡繁成,警方通過查閱死者的電腦和手機(jī)吓笙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朴艰,“玉大人观蓄,你說我怎么就攤上這事§羰” “怎么了侮穿?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長毁嗦。 經(jīng)常有香客問我亲茅,道長,這世上最難降的妖魔是什么狗准? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任克锣,我火速辦了婚禮,結(jié)果婚禮上腔长,老公的妹妹穿的比我還像新娘袭祟。我一直安慰自己,他們只是感情好捞附,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布巾乳。 她就那樣靜靜地躺著,像睡著了一般鸟召。 火紅的嫁衣襯著肌膚如雪胆绊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天欧募,我揣著相機(jī)與錄音压状,去河邊找鬼。 笑死跟继,一個(gè)胖子當(dāng)著我的面吹牛种冬,可吹牛的內(nèi)容都是我干的镣丑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼娱两,長吁一口氣:“原來是場噩夢啊……” “哼传轰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谷婆,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辽聊,沒想到半個(gè)月后纪挎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跟匆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年异袄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玛臂。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烤蜕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出迹冤,到底是詐尸還是另有隱情讽营,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布泡徙,位于F島的核電站橱鹏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏堪藐。R本人自食惡果不足惜莉兰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望礁竞。 院中可真熱鬧糖荒,春花似錦、人聲如沸模捂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枫绅。三九已至泉孩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間并淋,已是汗流浹背寓搬。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留县耽,地道東北人句喷。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓镣典,卻偏偏與公主長得像,于是被迫代替她去往敵國和親唾琼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子兄春,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan閱讀 4,168評(píng)論 2 7
  • 以下是一個(gè)對(duì)我很重要的人的簡歷: 63年,初中畢業(yè)锡溯,由于家庭原因沒有升學(xué)赶舆。在家務(wù)農(nóng)。 64年祭饭,下半年芜茵,本人參加縣組...
    Sunny857閱讀 335評(píng)論 1 1
  • 你是一朵蓮, 沐浴著虔誠的梵音倡蝙, 在佛前修行千年九串; ... 你是一朵蓮, 聆聽著菩薩的心寺鸥, 參悟著寶相莊嚴(yán)猪钮; .....
    奔奔的果果閱讀 3,612評(píng)論 92 105
  • 我愛你,你愛他胆建,他不愛你烤低,這是一個(gè)互相追逐的故事 你我初次見面 一個(gè)女孩出現(xiàn)在了你的生活中,她成為了你的鄰居笆载,她愛...
    DOMO3847閱讀 428評(píng)論 0 0
  • 今天上午老師檢查幾個(gè)人的信拂玻,在檢查信的時(shí)候有幾位同學(xué)沒有的老師非常生氣。 我們來到了學(xué)校首先我們...
    劉宇晨閱讀 180評(píng)論 0 1