工作中需要使用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
}
其他使用的方法都是比較簡單的直接傳入文件名稱,就可完成查詢碱妆,刪除操作肉盹。