添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • 在线音乐 戳我呀!
  • 音乐博客源码 上线啦!
  • 最近在整理自己的 在线音乐 (因为最近换服务器了),发现上传的图片文件很杂乱,如:音乐上传到minio中(文件服务器),IT知识模块的图片上传在Node指定的文件夹中,其他模块的文件又是Node的另外一个文件夹。
  • 就想着能不能全部都由一个来管理这些文件,优先想到之前实习的时候公司(dpf)搭建个文件服务器,也用了一下确实是挺方便的,也就是今天的主角 -- Minio。
  • 其实自己的 在线音乐 已经用了很久了,只不过没有说对全部文件都归其管理,再加上现在应用部署在Docker上,不知道为什么Node文件映射失败,但Minio却映射得出来,这也是一开始初心想文件都放在minio中。
  • 上一篇 有请Minio统一管理文件 文章有实操代码,但好像少了点什么?
  • oh ~ 原来是少了点常用报错处理总结,这不,后续来了。刚好换服务器的时候还真遇到一个棘手的问题。
  • Are you ready ?
  • 假期再次快乐。

    先来张图效果。

    Minio界面直观、可视化界面、方便管理、上传下载流程简单,还能设置权限、失效时间等等。

    使用三年,遇到的坑

    从win拷过来linux使用命令是不可以的(总是cvcv,果然出事了?)

    新版本有问题,建议使用 minio/minio:RELEASE.2021-06-17T00-10-46Z (寻找回忆中的Minio)

    MINIO_ACCESS_KEY和MINIO_SECRET_KEY已弃用?

    putObject上传后得到的url在浏览器里打开是下载文件,而不是直接显示图片(putObject图片后,图片加载不了💔)

    一、cv出问题了?

    minio一开始是部署到47上的window,后面47服务器换成docker环境,minio也换成了docker运行,再后来被我迁移到39的docker上。(因为服务器到期)

    过程也是坎坷,但也正因为这些“风雨”,才能见到“彩虹”。

    在47服务器上的docker环境已经是半年前的事情了,当时一顿操作如下:

    // 拉取minio镜像
    docker pull minio/minio
    // 跑起
    docker run -p 9000:9000 --name minio -d 
    -e "MINIO_ACCESS_KEY=admin" 
    -e "MINIO_SECRET_KEY=123456" 
    -v /home/minio:/data 
    -v /home/minio/config:/root/.minio 
    minio/minio  server /data
    

    这些参数在上一篇有请Minio统一管理文件文章有讲到哦~

    然后就可以正常运行起来了。

    前几天从47 -> 39服务器,我也跟47一样的操作,直接拉闸。

    报了:No such file or directory

    遇到错不要慌,先找下有用过的人。

    好,我都懂的。一个人也很好的。

    于是我百度了一遍,其中有一篇给了我灵感。

    他的意思是说:在win开发的脚本,需要转换一下格式。

    因为我的那串长长的docker run minio ...命令是从dos文档上复制过来的,直接拷到linux上可能有编码上的问题,于是我怀着猜测的心态去手敲了一遍,竟然,竟然就真的运行成功了!

    可恶,这对于懒人cv真是个小坑。

    二、寻找回忆中的Minio

    minio成功在docker上运行起来了,正当我要访问的时候,访问失败。

    2.1 发现问题

    怎么会访问不了呢?端口映射了,防火墙也关了,访问不了也算了,还有一个奇怪的现状是我明明输入的是9000端口,可它却自动给我跳到41757这个陌生的端口上。

    感觉他访问我9000不通,于是就自动跳到41757端口上。

    2.2 尝试找到问题所在

    连忙查下日志。

    ❓ 会不会是新版本不一样了?

    2.3 有点小思路

    因为之前拉取的minio已经是半年前了,查了更新记录也确实是有更新版本。

    查询minio服务版本:docker search minio

    新版本升级太快了,于是找到旧版本,建议大家选择minio/minio:RELEASE.2021-06-17T00-10-46Z这个版本,因为其他版本坑也挺多的。

    通过以上的坑,我们发现minio的版本更新迭代特别快,最新版本的已经变得面目全非,不认识了。我查阅了最新官网发布版本。

    大大小小已经发布了200多个版本了。

    我们选择的2021年6月17号

    2.4 实战一下

    可能找到问题所在,那就来试一下。

    2.4.1 拉取minio镜像

    docker pull minio/minio:RELEASE.2021-06-17T00-10-46Z
    

    2.4.2 启动

    docker run -p 9000:9000 minio/minio:RELEASE.2021-06-17T00-10-46Z server /data
    // 或者自定义账号密码
    docker run -p 9000:9000 --name minio -d 
    -e "MINIO_ACCESS_KEY=admin" 
    -e "MINIO_SECRET_KEY=123456" 
    -v /home/minio:/data 
    -v /home/minio/config:/root/.minio 
    minio/minio:RELEASE.2021-06-17T00-10-46Z  server /data
    

    T喵的,跑起来了!

    果然是版本的问题,版本升级太快了,还好找到了旧版本。

    三、MINIO_ACCESS_KEY和MINIO_SECRET_KEY已弃用?

    今天悠哉悠哉,就想起登录一下minio看看我的音乐文件在里面怎么样。

    结果登录的时候提示:Authentication failed, check your access credentials

    于是赶紧查下日志看看有没有什么有用的报错信息。

    警告:MINIO_ACCESS_KEY和MINIO_SECRET_KEY已弃用。
    请使用MINIO_ROOT_USER和MINIO_ROOT_PASSWORD
    

    说run的时候MINIO_ACCESS_KEY和MINIO_SECRET_KEY已弃用了, 要使用新的MINIO_ROOT_USER和MINIO_ROOT_PASSWORD去设置账号密码。

    于是我停止了我的minio服务,打算换个run命令。

    新的命令:

    docker run -p 9000:9000 --name minio -d 
    -e "MINIO_ROOT_USER=admin" 
    -e "MINIO_ROOT_PASSWORD=123456" 
    -v /home/minio:/data 
    -v /home/minio/config:/root/.minio 
    minio/minio:RELEASE.2021-06-17T00-10-46Z  server /data
    

    可当我使用新的命令跑的时候,报了另外一个错误。

    ‘ server’ is not a minio sub-command. See ‘minio --help’

    当您使用不是 minio 命令的参数运行 minio 命令时,这会显示。

    不是说MINIO_ACCESS_KEY和MINIO_SECRET_KEY已弃用了, 要使用新的MINIO_ROOT_USER和MINIO_ROOT_PASSWORD去设置账号密码吗?

    怎么就不是新的minio命令参数了。

    查了之后也找不到其他解决方法,就想着之前2.4.2 启动也是简单启动一下minio服务。

    docker run -p 9000:9000 minio/minio:RELEASE.2021-06-17T00-10-46Z server /data
    

    然后启动成功了,于是我重新跑一下之前的命令。

    docker run -p 9000:9000 --name minio -d 
    -e "MINIO_ACCESS_KEY=admin" 
    -e "MINIO_SECRET_KEY=123456" 
    -v /home/minio:/data 
    -v /home/minio/config:/root/.minio 
    minio/minio:RELEASE.2021-06-17T00-10-46Z  server /data
    

    跑起来了,minio管理页面也可以登录上去了,说好的MINIO_ACCESS_KEY和MINIO_SECRET_KEY已弃用呢?

    莫名其妙报错了,还好我的nginx设置了资源缓存,浏览器就可以缓存资源(30天)。

    from disk cache,还好有缓存资源,不会导致音乐模块的图片在minio服务有问题时加载不出来。

    还有一个现象是:minio管理界面登录不进去(报错的时候),但访问资源还是可以访问的,说明服务并没有挂。

    四、putObject图片后,图片加载不了💔

    4.1 发现问题

    着重讲一个JavaScript中的putObject方法,正当我用koa2使用着minio的这个方法上传文件,发现文件上传完后,前端获取链接竟然无法正常显示。

    4.2 核对官方例子

    先贴下minio的方法说明。

    在看一下实际代码中如何调用。

    直接拿官方例子代码使用。

    var Fs = require('fs')
    var file = '/tmp/40mbfile'
    var fileStream = Fs.createReadStream(file)
    var fileStat = Fs.stat(file, function(err, stats) {
      if (err) {
        return console.log(err)
      minioClient.putObject('mybucket', '40mbfile', fileStream, stats.size, function(err, objInfo) {
          if(err) {
              return console.log(err) // err should be null
       console.log("Success", objInfo)
    

    图片上传成功,官网例子果然没有让我失望,于是我顺理成章返回给前端图片的URL显示。

    发现却显示不了?

    检查了一下,原来是链接没写端口号,粗心了啊。

    加上之后,还是显示不了?

    4.3 JavaScript上传图片和其他图片图标不一样

    打开minio管理界面确认是不是加上去了。

    ❓ 怎么我上传的875.jpg和别的图片不一样?

    🙋其他不是灰色的图片是我手动点击加号手动上传上去。

    4.4 抄一下java如何写的(之前有写过,确定成功过)

    自己通过koa2上传则是灰色的,灵机一动,之前java写过上传音乐模块putObject方法代码,去看看java是怎么写的。

    java代码如下:

    MinioUtils.putObject(
        singerSong.getBucketName(), 
        objectName, 
        file.getInputStream(), 
        file.getSize(), 
        file.getContentType()
    

    而上面的JavaScript如下:

    minioClient.putObject(
        'mybucket', 
        '40mbfile', 
        fileStream, 
        stats.size
    

    对比了一下,JavaScript没有传文件的类型,而java有传,怪不得minio管理界面没有显示文件的类型,原来是我没写。

    难道是我写漏了?官网再走一波。

    T瞄的,我的代码就是从官网例子复制过来的。例子并没有传文件类型。

    只能从官网上的metaData这个参数下手了,可能就是文件类型。

    然而不知道元数据是什么,官网也没有说,怎么传,有点小坑。

    🙋寻找解决问题之路。

    4.5 少传ContentType参数?

    有一个人跟我一样,也是发现这个问题,说进该方法类仔细看了一下,好家伙居然方法偷偷改过了但是官网还没改,于是他说多传ContentType参数就可以了。

    于是我也去看了下putObject源码:

    并没有看到我想看到的ContentType参数。

    4.6 改下源码?

    好家伙,有人说直接改源码,确实是一个办法,不过这是被逼无奈才选择的下策,再找找吧。

    4.7 官方例子说了 == 白说?

    minio官方github也发现了这个问题,说多传content-type就可以解决,我也知道多传,那到底怎么传呢?

    反正没有设置文件类型,把url放在浏览器,就会直接下载,如果类型正确,是可以预览的,不会一来就给你下载。

    4.8 元数据参数得以解释

    直到我看到这篇。说什么不重要,重要的是metaData有人使用了。

    我的代码改造如下:

    var Fs = require('fs')
    var file = '/tmp/40mbfile'
    var fileStream = Fs.createReadStream(file)
    var fileStat = Fs.stat(file, function(err, stats) {
      if (err) {
        return console.log(err)
      minioClient.putObject(
      'mybucket', 
      '40mbfile', 
      fileStream, 
      stats.size, 
      {'Content-Type': type}, // 这个type从前端上传的file对象可以获得
      function(err, objInfo) {
          if(err) {
              return console.log(err) // err should be null
           console.log("Success", objInfo)
    

    成功了,前端可以正常显示了,minio管理界面也正常显示图片类型图标。

    五、桶名切记不可大写

    创建桶的时候,发现怎么老是报错,最后竟然是名字(itKnowledge)有问题,不能大写。

    大家记得看官网介绍呀!

    不经历风雨,怎么见彩虹。

    重构了,总会有所收获,有所成长,在线音乐希望越来越好,会不断更新,直到干不动了。

    记得实习公司的时候,同一个学校的师兄跟我说:代码不建议cvcv,要多手打,才会记住,在这次minio使用过程中(一、cv出问题了?),已深刻明白了,以后开发中会刻意手打。

    上传到master稳定版本的时候真的是最稳定的版本吗?啊,minio。(二、寻找回忆中的Minio

    这次实战中也知道缓存的重要性,如果程序崩了,浏览器还设置了30天的缓存时间,不会马上给客户视觉上的憎恨,当然,强制刷新就当我没说😁。(三、MINIO_ACCESS_KEY和MINIO_SECRET_KEY已弃用?

    问题存在并不可怕,可怕的是你真的认真认真查过问题了吗,别一来就改源码,会不会是我们使用的方式不对呢。(四、putObject图片后,图片加载不了

    如果对您有帮助,你的点赞是我前进的润滑剂。

    Docker -minio安装使用

    Docker安装Minio,填满最新版大坑

    Heroku: deploying minio server with Dockerfile CMD failure

    [BUG] 上传到 minio 的时候没有设置content-type #129

    使用minio接口里上传的图片无法在管理界面预览,直接在管理界面上传的图片可以预览

    VUE无法直接上传文件到MinIO,提示 _fs.default.stat is not a function ?

    有请Minio统一管理文件(实操JS、JAVA)

    尤大大说我的代码全部不加分号

    老湿说的万物皆对象,你也信?

    Vue-Cli3搭建组件库

    Vue实现动态路由(和面试官吹项目亮点)

    项目中你不知道的Axios骚操作(手写核心原理、兼容性)

    VuePress搭建项目组件文档

    koa2+vue+nginx部署

    vue-typescript-admin-template后台管理系统

    juejin.cn/post/701515…