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
}

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

扫描二维码关注公众号,回复: 9811158 查看本文章
发布了4 篇原创文章 · 获赞 1 · 访问量 1776

猜你喜欢

转载自blog.csdn.net/weixin_43883826/article/details/100886613
今日推荐