图床文件迁移之路.md

2022/6/7 实用工具

大家好~我是米洛
我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持。
欢迎关注我的公众号米洛的测开日记,一起交流学习!

# 最后一次谈图床的事

上次咱不是说了gitee的图床失效了嘛,于是我发现我的使用文档很多图片都挂了,现在大概是这样:

各种图片都莫得了,于是我很懊恼,这问题必须得解决是不。但苦于这个工程比较浩大,所以我们得自己做点事情。

# 下载旧图片

我们知道之前的图片url都是https://xxx.com/xxx/日期/时间戳.png,那我们能不能把数据都下载下来,然后上传到新的oss呢?肯定是可以的,所以我们先做第一步: 下载老数据

好在gitee提供了下载功能,我们先下载历史图片的压缩包,大概700mb,也不算小了。

# 解压图片并上传

我们把zip解压,会发现它与gitee里面的目录结构长得一样,所以接下来我们要做的事情就是,按照2021-10-1/图片名称.png这样的形式传入oss。我们打开七牛云控制台:

新建picture文件夹,接着上传文件就可以啦!但事情并不是太简单,这个页面不支持选中文件夹,所以于是贴心的我自己写了一个七牛云上传的脚本,这次选了go的客户端。

代码都放在下面了:

package main

import (
	"context"
	"fmt"
	"github.com/qiniu/go-sdk/v7/auth/qbox"
	"github.com/qiniu/go-sdk/v7/storage"
	"io/fs"
	"path/filepath"
	"runtime"
	"strings"
)

// 文件上传客户端
type client struct {
	mac    *qbox.Mac
	bucket string
	token  string
}

// 上传成功后的响应体
type MyPutRet struct {
	Key    string
	Hash   string
	Fsize  int
	Bucket string
	Name   string
}

// 初始化客户端,类似于__init__()
func NewClient(accessKey, secretKey, bucket string) *client {
	putPolicy := storage.PutPolicy{
		Scope: bucket,
	}
	mac := qbox.NewMac(accessKey, secretKey)
	return &client{
		mac:    mac,
		bucket: bucket,
		token:  putPolicy.UploadToken(mac),
	}
}

// 上传文件
func (c *client) UploadFile(key, filePath string) error {
	putPolicy := storage.PutPolicy{
		Scope:      c.bucket,
		ReturnBody: `{"key":"$(key)","hash":"$(etag)","fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)"}`,
	}
	upToken := putPolicy.UploadToken(c.mac)
	cfg := storage.Config{}
	formUploader := storage.NewFormUploader(&cfg)
	ret := MyPutRet{}
	putExtra := storage.PutExtra{
		Params: map[string]string{
			"x:name": "qiniuUpload",
		},
	}
	err := formUploader.PutFile(context.Background(), &ret, upToken, key, filePath, &putExtra)
	if err != nil {
		return err
	}
  // 打印上传结果
	fmt.Println(ret.Bucket, ret.Key, ret.Fsize, ret.Hash, ret.Name)
	return nil
}

// 上传目录
func (c *client) UploadDirectory(fileDirectory string) {
	filepath.WalkDir(fileDirectory, func(path string, d fs.DirEntry, err error) error {
		if d.IsDir() {
			return nil
		}
    // 这里的path是全路径,我们去掉当前文件夹目录,只拿到对应目录的文件
		realPath := strings.TrimPrefix(path, fileDirectory)
		// 如果是windows,我们需要把\替换成/
    if runtime.GOOS == "windows" {
			realPath = strings.Replace(realPath, "\\", "/", -1)
		}
    // 获取到的文件路径是空我们不处理
		if realPath == "" {
			return nil
		}
    // 由于我这里的根路径是picture,所以手动加上前缀
		return c.UploadFile("picture/"+realPath, path)
	})
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87

具体的操作,都是依据七牛云的官方SDK文档来做的,本身我想把这个包搞到github给大家下载的,后来发现没啥必要,一锤子买卖,下次基本用不到了。注释我都写得很清楚了,差不多思路就是遍历对应的文件夹,然后挨个上传文件了。

下面是go.mod,如果没用go module,那再GOPATH里面加入对应的库即可。

module qiniuUpload

go 1.18

require github.com/qiniu/go-sdk/v7 v7.11.1

require golang.org/x/sync v0.0.0-20201207232520-09787c993a3a // indirect
1
2
3
4
5
6
7

我们来看看效果:

全部传上来了!如果对go不熟悉的,也需要这段代码的,建议可以自己亲手写一下,写出来会给自己加点信心,没啥难度的,但是这时候你会发现编程的乐趣

# 替换文档的所有链接

ide的伟大之处,除了全局搜索,还有全局替换呢!我找到自己的项目文档,开始CTRL+SHIFT+R,全局替换:

把gitee的地址通通换成七牛云的域名,嘿嘿。。待会静待页面恢复(装逼开始)

太给力了,我只能说舒服了!!!