拖曳文件上传到七牛的Python脚本

一直用七牛云存储当图床,每次写博客需要插入图片时,都是打开网页手动上传,然后复制网址到文章中,图片多的时候就非常不方便。七牛虽然提供了上传工具,但是并没有反馈上传后的文件网址。于是自己写了一个。

用法介绍

比如我要传这三个文件:
脚本与待上传文件.png

选中三个文件,拖曳到脚本图标上。上传成功后弹出结果:

![11.jpg](http://7xo8t2.com1.z0.glb.clouddn.com/img/11.jpg)
![22.jpg](http://7xo8t2.com1.z0.glb.clouddn.com/img/22.jpg)
[Python标准库中文版.pdf](http://7xo8t2.com1.z0.glb.clouddn.com/file/Python%E6%A0%87%E5%87%86%E5%BA%93%E4%B8%AD%E6%96%87%E7%89%88.pdf)

生成了图片和文件链接对应的Markdown写法,可以直接把它们复制出来粘贴到文件中。

脚本代码

必须先安装七牛SDK Python版:

pip install qiniu

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: LoveNight
# @Date: 2015-11-16 18:17:17
# @Last Modified by: LoveNight
# @Last Modified time: 2015-11-18 17:34:12

import qiniu
import urllib
import sys
import os
import msvcrt
import datetime
import subprocess

__author__ = "loveNight"


"""将图片拖曳到此脚本即可自动上传

会在同文件目录下生成图片的markdown格式引用地址
使用前先配置好下面的参数
"""


# ----------------手动配置区---------------
accessKey = 自己填
secretkey = 自己填
# 上传空间的域名,需要自己去后台获取
bucket_url = {
自己填: 自己填,
}
bucket = 自己填 # 上传空间

# ----------------默认配置区-------------------------
img_suffix = ["jpg", "jpeg", "png", "bmp", "gif"]
os.chdir(sys.path[0])
result_file = "上传结果.txt" # 保存上传结果

if os.path.exists(result_file):
os.remove(result_file)


class Qiniu(object):

"""七牛上传与下载的工具类

需要七牛的Python SDK
pip install qiniu
SDK详细用法见 http://developer.qiniu.com/docs/v6/sdk/python-sdk.html
"""

SUCCESS_INFO = "上传成功!"

def __init__(self, accessKey, secretkey):
self.accessKey = accessKey
self.secretkey = secretkey
self._q = qiniu.Auth(self.accessKey, self.secretkey)

def upload_file(self, bucket, up_filename, file_path):
"""上传文件

Args:
bucket: 上传空间的名字
up_filename: 上传后的文件名
file_path: 本地文件的路径
Returns:
ret: dict变量,保存了hash与key(上传后的文件名)
info: ResponseInfo对象,保存了上传信息
url: st, 上传后的网址
"""

token = self._q.upload_token(bucket)
ret, info = qiniu.put_file(token, up_filename, file_path)
url = self.get_file_url(bucket, up_filename)
return ret, info, url

def get_file_url(self, bucket, up_filename):
if not bucket in bucket_url.keys():
raise AttributeError("空间名不正确!")
url_prefix = bucket_url[bucket]
url = url_prefix + urllib.parse.quote(up_filename)
return url


def save(filename, url):
line = "[%s](%s)\n" % (filename, url)
# 如果是图片则生成图片的markdown格式引用
if os.path.splitext(filename)[1][1:] in img_suffix:
line = "!" + line
with open(result_file, "a", encoding="utf-8") as f:
f.write(line)


def getTimeStr():
"""返回 2015/11/18/17/16/8/ 形式的字符串

如果上传同名文件且前缀相同,则后上传的文件会顶掉先前的
加时间作为前缀,即便于检索,又避免此问题
"""

now = datetime.datetime.now()
tmp = tuple(now.timetuple())[:-3]
tmp = map(str, tmp)
return "/".join(tmp) + "/"

if __name__ == '__main__':

if len(sys.argv) == 1:
print("请将文件拖曳到本脚本!")
sys.exit(0)
files = sys.argv[1:]

q = Qiniu(accessKey, secretkey)
timeStr = getTimeStr()

for file in files:
if os.path.isdir(file):
print("暂不支持目录上传!")
sys.exit(0)
if os.path.isfile(file):
suffix = os.path.splitext(file)[1][1:]
prefix = "img/" if suffix in img_suffix else "file/"
prefix += timeStr
name = os.path.split(file)[1]
up_filename = prefix + name
ret, info, url = q.upload_file(bucket, up_filename, file)
print("已上传: %s " % name)
save(name, url)
subprocess.call(result_file, shell=True) # 打开文件
loveNight wechat
我的微信公众号,放一些有趣的内容,不定期更新。