首页 > 其他分享 >go-Typora上传图片-Custom Command上传图片到Gitee

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

时间:2022-11-23 10:46:18浏览次数:70  
标签:文件 string err Typora json Path path 上传 图片

概述

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

测试API

Gitee API 文档

新建文件

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

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

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
	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 "上传文件路径"
	if g.Path == "" {
		g.Path = filepath.Base(pic)
	} else {
		g.Path = strings.Trim(g.Path, "/") + "/" + 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
	}
	// 路径置空 --
	// 处理的小bug,因为path没有置空,多文件时会将前面的文件名更改为前缀路径,上传显示成功,实际成功了一个寂寞(给文件夹做了个提交),Content也为nil
	g.Path = ""
	// 开始上传文件
	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...")
		return
	}
	// 创建请求结构体
	giteeRequest := &GiteeRequest{
		Access_token: os.Args[1],
		Owner:        os.Args[2],
		Repo:         os.Args[3],
		Branch:       os.Args[4],
		Path:         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

标签:文件,string,err,Typora,json,Path,path,上传,图片
From: https://www.cnblogs.com/luoxian1011/p/16917535.html

相关文章

  • 解决在Vue3中html2canvas图片跨域问题
    <divv-html="transformImg(textContent.policyInterpretation)"class="topicContent"></div>consttransformImg=(str)=>{constreplaceCallback=(m,......
  • 搞笑图片
    有好玩的图片欢迎私信(欢迎转载)转载自我的Luogu:https://www.luogu.com.cn/paste/q6j9g0kf......
  • CSS实现标题和图片混合
    ResultCode<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="view......
  • JAVA- 动漫美女拼图(记录0号图片位置)
    代码一packagecom.itheima_02;publicclassApp{publicstaticvoidmain(String[]args){PictureFramepf=newPictureFrame();}}代码二pa......
  • 求超大文件上传方案( asp.net )
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持......
  • ffmpeg-视频转图片
    视频转图片ffmpeg-i1.mp4-r5-fimage2.\output\1_frame_%05d.bmp"-r5"代表一秒中抽取五帧“image2”代表图片的类型,“%05d”代表五位的数,如“00001”输出图......
  • SpringBoot 中大文件(分片上传)断点续传与极速秒传功能的实现
    ​ 1.创建SpringBoot项目本项目采用springboot+mybatis-plus+jquery+thymeleaf组成2.项目流程图​编辑3.在pom中添加以下依赖123456789101112......
  • ASEMI肖特基二极管MBR15200FAC参数,MBR15200FAC图片
    编辑-ZASEMI肖特基二极管MBR15200FAC参数:型号:MBR15200FAC最大重复峰值反向电压(VRRM):200V最大RMS电桥输入电压(VRMS):140V最大直流阻断电压(VDC):200V最大平均正向整流输出电流(IF):15A......
  • ASEMI肖特基二极管MBR15200FAC参数,MBR15200FAC图片
    编辑-ZASEMI肖特基二极管MBR15200FAC参数:型号:MBR15200FAC最大重复峰值反向电压(VRRM):200V最大RMS电桥输入电压(VRMS):140V最大直流阻断电压(VDC):200V最大平均正向整流输出电......
  • Qt之改变窗口背景图片
    基类为Widget的窗口使用加载资源然后右键单击改变样式表改变的背景图片的方式并不好用,原因setStyleSheet()该函数只能用于设置有父窗口的子窗口的背景!如果一个窗口没有子窗......