这篇文章上次修改于 955 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

平时刷推和各种图片网站收集了大量图片,舍不得删除全存进了硬盘,大概已经达到了46000多张,以前不多的时候还可以用Nginx做索引,多了加载会非常慢,只能换一种方法来查看这些图片了。

  • 将这些图片归档入库,数据库暂时选定MySQL5.7,图片数量巨大,一条一条INSERT肯定不现实,故需要写点代码来实现
  • 首先先创建数据库

    CREATE DATABASE `images` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci';
  • 创建表

    CREATE TABLE `images`.`img_images`  (
    `id` varchar(32) NOT NULL,
    `name` varchar(255) NOT NULL,
    `date` varchar(50) NULL,
    `tag` varchar(255) NULL,
    PRIMARY KEY (`id`)
    );
  • id作为主键,存储图片名称的MD5值,同一目录下文件名称不存在同名故MD5也不会重复
  • name存储文件名称
  • date存储图片创建(存入硬盘)的日期
  • 以上操作完成后检查数据库和数据表是否创建成功
  • 使用Python,上代码(main.py)

    import pymysql
    import json
    import os
    import hashlib
    import time
    from datetime import datetime
    
    
    def findAllFile(base):
      for root, ds, fs in os.walk(base):
          for f in fs:
              yield f
    
    
    def main():
      with open('config.json', 'r') as f:
          data = json.load(f)
          address = data['address']
          port = data['port']
          user = data['mysql-user']
          passwd = data['mysql-pass']
          database = data['database']
          base = data['local']
      db = pymysql.connect(host=address, user=user, password=passwd,
                           database=database, charset='utf8mb4')
      cursor = db.cursor()
      for i in findAllFile(base):
          filedatetime = time.ctime(os.path.getctime(base + "/" + i))
          filedatetimes = datetime.strptime(filedatetime, '%a %b %d %H:%M:%S %Y')
          filetime = filedatetimes.strftime("%Y-%d-%m %H:%M:%S")
          hl = hashlib.md5()
          hl.update(i.encode(encoding='utf-8'))
          id_hl = hl.hexdigest()
          id = str(id_hl)
          sql = 'INSERT INTO img_images(id, name, date) VALUES ("%s", "%s", "%s") ON duplicate KEY UPDATE id = id ' % (
              id, i, filetime)
          cursor.execute(sql)
          db.commit()
          print(i)
      db.close()
    
    
    if __name__ == '__main__':
      main()
  • 此外还需要一个配置文件(config.json),与mian.py在同一目录

    {
      "local": "J:\\images",
      "address": "localhost",
      "port": 3306,
      "mysql-user": "root",
      "mysql-pass": "root",
      "database": "images",
      "pic-url": "http://localhost:81/"
    }
  • local:图片路径
  • address:数据库IP地址
  • port:数据库端口
  • mysql-user:数据库用户名
  • mysql-pass:数据库密码
  • database:数据库名