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
}

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章