七牛上傳小工具-Go語言版本

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

運行環境: Mac os X and Linux 

現在目前的目錄下建立qiniu.json檔案:

{"AK":"XXX" ,"SK":"XXX", "BN":"xx"}
package mainimport ("encoding/json""fmt""io/ioutil""os""path""strings")import (. "github.com/qiniu/api/conf""github.com/qiniu/api/io""github.com/qiniu/api/rs""github.com/qiniu/log")import ("etag")var uptoken stringvar buckName stringvar currentDir stringfunc init() {currentDir, _ = os.Getwd()file, err := os.Open(currentDir + "/" + "qiniu.json") // For read access.if err != nil {log.Fatal(err)}configFromFile, _ := ioutil.ReadAll(file)var conf configerr = json.Unmarshal([]byte(configFromFile), &conf)if err != nil {fmt.Println("error:", err)}ACCESS_KEY = conf.AKSECRET_KEY = conf.SKbuckName = conf.BNuptoken = getUpToken(buckName)}type config struct {AK stringSK stringBN string}func main() {filePathArgs := os.Args[1]if filePathArgs == "" {fmt.Println("please input the file's path")}filePath := filePathArgsif !strings.ContainsRune(filePathArgs, '/') {filePath = currentDir + "/" + filePathArgs}etag, err := etag.GetEtag(filePath)if err != nil {fmt.Fprintln(os.Stderr, err)return}fileSuffix := getSuffix(filePath)fmt.Println("etag:" + etag)key := etag + fileSuffixdoUpload(filePath, key)}//genereate  uptoken  for uploading to qiniufunc getUpToken(bucketName string) string {putPolicy := rs.PutPolicy{Scope: bucketName,//CallbackUrl: callbackUrl,//CallbackBody:callbackBody,//ReturnUrl:   returnUrl,//ReturnBody:  returnBody,//AsyncOps:    asyncOps,//EndUser:     endUser,//Expires:     expires,}return putPolicy.Token(nil)}func doUpload(localFile string, key string) {var err errorvar ret io.PutRetvar extra = &io.PutExtra{//Params:    params,//MimeType:  mieType,//Crc32:     crc32,CheckCrc: 0,}// ret       變數用於存取返回的資訊,詳情見 io.PutRet// uptoken   為商務服務器產生的上傳口令// key       為檔案儲存體的標識// localFile 為本地檔案名稱// extra     為上傳檔案的額外資訊,詳情見 io.PutExtra,可選err = io.PutFile(nil, &ret, uptoken, key, localFile, extra)if err != nil {//上傳產生錯誤log.Print("io.PutFile failed:", err)return}//上傳成功,處理傳回值//fmt.Println("hash:", ret.Hash, "key:", ret.Key)fileUrl := "http://" + buckName + ".qiniudn.com/" + ret.Keyfmt.Println("file's url:")fmt.Println(fileUrl)}func getSuffix(filePath string) string {fileNameWithSuffix := path.Base(filePath)fileSuffix := path.Ext(fileNameWithSuffix)return fileSuffix}
package etagimport ("bytes""crypto/sha1""encoding/base64"//"fmt""io""os")const (BLOCK_BITS = 22 // Indicate that the blocksize is 4MBLOCK_SIZE = 1 << BLOCK_BITS)func BlockCount(fsize int64) int {return int((fsize + (BLOCK_SIZE - 1)) >> BLOCK_BITS)}func CalSha1(b []byte, r io.Reader) ([]byte, error) {h := sha1.New()_, err := io.Copy(h, r)if err != nil {return nil, err}return h.Sum(b), nil}func GetEtag(filename string) (etag string, err error) {f, err := os.Open(filename)if err != nil {return}defer f.Close()fi, err := f.Stat()if err != nil {return}fsize := fi.Size()blockCnt := BlockCount(fsize)sha1Buf := make([]byte, 0, 21)if blockCnt <= 1 { // file size <= 4Msha1Buf = append(sha1Buf, 0x16)sha1Buf, err = CalSha1(sha1Buf, f)if err != nil {return}} else { // file size > 4Msha1Buf = append(sha1Buf, 0x96)sha1BlockBuf := make([]byte, 0, blockCnt*20)for i := 0; i < blockCnt; i++ {body := io.LimitReader(f, BLOCK_SIZE)sha1BlockBuf, err = CalSha1(sha1BlockBuf, body)if err != nil {return}}sha1Buf, _ = CalSha1(sha1Buf, bytes.NewReader(sha1BlockBuf))}etag = base64.URLEncoding.EncodeToString(sha1Buf)return}// func main() {//// if len(os.Args) < 2 {// fmt.Fprintln(os.Stderr, `Usage: qetag <filename>`)// return// }// etag, err := GetEtag(os.Args[1])// if err != nil {// fmt.Fprintln(os.Stderr, err)// return// }// fmt.Println(etag)// }


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.