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

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

  • 将这些图片归档入库,数据库暂时选定MySQL5.7,图片数量巨大,一条一条INSERT肯定不现实,故需要写点代码来实现
  1. 首先先创建数据库
CREATE DATABASE `images` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci';
  1. 创建表
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存储图片创建(存入硬盘)的日期
  1. 以上操作完成后检查数据库和数据表是否创建成功
  2. 使用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()
  1. 此外还需要一个配置文件(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:数据库名