1.介绍
官方介绍是:
MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。
实际上他就是个对象存储服务,跟平时用的oss,oos都没得啥区别。
2.下载安装
直接贴地址好吧 https://docs.min.io/cn/minio-quickstart-guide.html
我下载的是windwos版的
微软Windows系统 | 64位 | https://dl.min.io/server/minio/release/windows-amd64/minio.exe |
下载完成后,cmd如下方式安装 后面那个目录就是你要初始化的位置
minio.exe server D:\Photos
如下界面表示成功启动。下次启动还是上面的命令目录跟上次一样的就好了。
这里报错提示的是,使用的默认账号密码。需要修改。
修改位置在你的初始化目录 + \.minio.sys\config\config.json, 打开后搜索 access_key和secret_key进行修改就好了,注意如果要修改一定要大于8位长度,不然启动会报错。
然后我们浏览器打开 http://127.0.0.1:9000/ 就可以进入面板操作了。
以下是python示例
编写工具类,下面简单写了一下如何上传文件和下载文件
from minio import Minio, ResponseError
from config import Config
class MyOss():
def __init__(self):
bucket_name = Config.myoss_bucket_name
self.myoss = Minio(Config.myoss_url,
access_key=Config.myoss_access_key,
secret_key=Config.myoss_secret_key,
secure=False)
# 检测是否有初始化的bucket没有则创建
try:
if not self.myoss.bucket_exists(bucket_name):
try:
print(self.myoss.make_bucket(bucket_name))
except ResponseError as err:
print(err)
except ResponseError as err:
print(err)
# 写入对象信息
def fput_object(self, object_name, data, ext):
content_type = "application/octet-stream"
if ext in ["png", "jpg", "jpeg"]:
content_type = f"image/{ext}"
elif ext in ["mp3", "wma", "wav"]:
pass
elif ext in ["mp4", "3gp", "mpeg", "flv"]:
pass
elif ext == "pdf":
content_type = f"image/pdf"
else:
content_type = "application/octet-stream"
try:
a1, a2 = self.myoss.fput_object(Config.myoss_bucket_name, object_name, data, content_type)
except Exception as e:
return False, e
return True, a1
# 读取对象信息
def get_object(self, filename):
return self.myoss.get_object(Config.myoss_bucket_name, filename)
简单的在接口中使用
from flask import Flask
from app.tools.myoss import MyOss
from config import Config
app = Flask(__name__)
app.config.from_object(Config)
myoss = MyOss()
from app import app,myoss
# 文件上传
@app.route('/api/upload', methods=['POST'])
def upload():
try:
file = request.files['file']
except Exception as e:
app.logger.error(e)
return resp_error("请上传文件!")
# 如果上传文件将检测文件后缀
if not file:
return resp_error("请上传文件!")
file_name = file.filename
if not upload_file_name(file_name, Config.ALLOWED_EXTENSIONS):
return resp_error("文件格式错误!")
file_name = file_name.replace("\"", "")
if '.' not in file_name:
return resp_error("文件格式错误!")
ext = file_name.rsplit('.', 1)[-1]
# 改变文件名字
nowTime = datetime.datetime.now().strftime("%Y%m%d%H%M%S") # 生成当前时间
uniqueNum = to_md5(str(uuid.uuid1()) + str(nowTime))
new_filename =uniqueNum + '.' + ext
# 保存文件
file_dir = os.path.join(Config.basedir, Config.UPLOAD_FOLDER)
if not os.path.exists(file_dir):
os.makedirs(file_dir)
new_path = os.path.join(file_dir, new_filename)
file.save(new_path) # 保存文件到upload目录
pok, msg = myoss.fput_object(object_name=new_filename, data=new_path,ext=ext)
if not pok:
app.logger.error(msg)
os.remove(new_path)
info = {'filename': new_filename}
return resp_ok("上传成功!", info)
# 读取文件
@app.route('/api/file/<string:filename>', methods=['GET'])
def get_file(filename):
data = myoss.get_object(filename)
try:
response = make_response(data.read())
headers = data.getheaders()
response.headers['Content-Type'] = headers['Content-Type']
response.headers['Content-Length'] = headers['Content-Length']
response.headers['Accept-Ranges'] = headers['Accept-Ranges']
return response
except Exception as e:
return "未找到该文件!", 404
目前只探索到这一步。更多内容请参考官方文档 https://docs.min.io/cn/minio-quickstart-guide.html