Loading

go-Typora上传图片-Custom Command上传图片到Gitee

概述

编写程序,读取图片路径 => 文件内容转换成base64 => 上传文件 => 返回文件url

测试API

Gitee API 文档

新建文件

POSThttps://gitee.com/api/v5/repos/{owner}/{repo}/contents/

Response Class

"root":
    "commit":
        "sha": string
        "author": string
        "committer": string
        "message": string
        "tree": string
        "parents": string
    "content":
        "name": string
        "path": string
        "size": string
        "sha": string
        "type": string
        "url": string
        "html_url": string
        "download_url": string
        "_links": string

Parameters

Parameter Value Description Type Data Type
access_token xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 用户授权码 formData string
owner* luoxian1011 仓库所属空间地址(企业、组织或个人的地址path) path string
repo* pictures 仓库路径(path) path string
path* pic.test4 文件的路径 path string
content* /9j/4AAQSkZJRgABAQAAAQABA... 文件内容, 要用 base64 编码 formData string
message* pic.test4 提交信息 formData string
branch master 分支名称。默认为仓库对默认分支 formData string
committer[name] Committer的名字,默认为当前用户的名字 formData string
committer[email] Committer的邮箱,默认为当前用户的邮箱 formData string
author[name] Author的名字,默认为当前用户的名字 formData string
author[email] Author的邮箱,默认为当前用户的邮箱 formData string

...

go代码-upPicv2

接收参数

  • Access_token (授权码)
  • Owner (账号)
  • Repo (仓库名)
  • Branch (仓库分支)
  • Path (仓库目录前缀)
  • 文件路径 (一个或多个)

返回输出:文件的url

Upload Success:
https://gitee.com/luoxian1011/pictures/raw/master/typora.go
...

代码:

package main

import (
	"bytes"
	"encoding/base64"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"os"
	"path/filepath"
	"strings"
	"time"
)

var (
	timestemp   = ""                                // 时间标签
	client      = &http.Client{}                    // 创建一个客户端
	apiUrl      = "https://gitee.com/api/v5/repos/" // Request URL
	repoPath    = ""                                // 仓库路径
	contentType = "application/json;charset=UTF-8"  // 定义网络文件的类型和网页的编码
)

type GiteeResponse struct {
	Message string                 `json:"message"` // 请求失败的消息
	Content map[string]interface{} `json:"content"` // 请求成功的内容
	Commit  map[string]interface{} `json:"commit"`  // 请求成功的commit
}

type GiteeRequest struct {
	Access_token string `json:"access_token"` // 用户授权码
	Owner        string `json:"owner"`        // 仓库所属空间地址(企业、组织或个人的地址path)
	Repo         string `json:"repo"`         // 仓库路径(path)
	Branch       string `json:"branch"`       // 分支名称。默认为仓库对默认分支
	Path         string `json:"path"`         // 文件的路径(目录+文件名,这里我默认目录为空,文件直接放在仓库根目录)
	Content      string `json:"content"`      // 文件内容, 要用 base64 编码
	Message      string `json:"message"`      // 提交信息
}

func (g *GiteeRequest) putPics(picSlice []string) {
	// 遍历文件列表
	for _, v := range picSlice {
		// 上传文件,返回文件url
		g.postOne(&v)
	}
}

func (g *GiteeRequest) postOne(pic *string) {
	// 读取文件
	fileByte, err := os.ReadFile(*pic)
	if err != nil {
		fmt.Println("打开文件失败:", err)
		return
	}
	// content "base64编码后的字符串"
	g.Content = base64.StdEncoding.EncodeToString(fileByte)
	// Path "上传文件路径"
	g.Path = strings.Trim(repoPath, "/") + "/" + filepath.Base(*pic)
	// message "Upload 文件名 by upPic"
	timestemp = time.Now().Format("2006-01-02 15:04:05")
	g.Message = "Upload " + g.Path + " by upPic - " + timestemp
	// url "https://gitee.com/api/v5/repos/luoxian1011/pictures/contents/pic.test3"
	postUrl := apiUrl + g.Owner + "/" + g.Repo + "/contents/" + g.Path
	// 序列化请求参数
	data, err := json.Marshal(g)
	if err != nil {
		fmt.Println("请求数据序列化失败:", err)
		return
	}
	// 开始上传文件
	response, err := client.Post(postUrl, contentType, bytes.NewReader(data))
	if err != nil {
		fmt.Println("上传文件失败:", err)
		return
	}
	body, err := io.ReadAll(response.Body)
	if err != nil {
		fmt.Println("读取响应失败! 响应码:", response.StatusCode, err)
		return
	}
	defer response.Body.Close() // 关闭
	// 如果状态码不是200,就是响应错误
	if response.StatusCode != 201 {
		fmt.Println("请求失败! 响应码:", response.StatusCode, string(body))
		return
	}
	// 序列化响应体
	var giteeResponse GiteeResponse
	err = json.Unmarshal(body, &giteeResponse)
	if err != nil {
		fmt.Println("序列化响应体失败:", err)
	}
	// https://gitee.com/luoxian1011/pictures/raw/master/pic.test
	fmt.Println("Upload Success:")
	// 输出文件url
	fmt.Println(giteeResponse.Content["download_url"])
}

func main() {
	// gitee pic
	// 命令行参数: 从第五个参数开始传入文件路径
	argsLen := len(os.Args)
	if argsLen <= 6 {
		fmt.Println("参数输入有误:")
		fmt.Println("Usage: upPic.exe access_token owner repo branch path file...")
		fmt.Println("Examp: upPic.exe xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx luoxian1011 pictures master test1.jpg")
		fmt.Println("Examp: upPic.exe xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx luoxian1011 pictures master test1.jpg test2.jpg")
		return
	}
	// 创建请求结构体
	giteeRequest := &GiteeRequest{
		Access_token: os.Args[1],
		Owner:        os.Args[2],
		Repo:         os.Args[3],
		Branch:       os.Args[4],
	}
	repoPath = os.Args[5]
	// 拿到文件路径切片
	picSlice := os.Args[6:]
	// 上传图片
	giteeRequest.putPics(picSlice)
}

typora - Custom Command

image-20221121021251418

  • 上传服务:Custom Command
  • 命令:"D:\GoProject\test\upPic.exe" xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx luoxian1011 pictures master ""

验证图片上传选项:

img

posted @ 2022-11-23 10:38  luoxian  阅读(42)  评论(0编辑  收藏  举报