使用MySQL归档硬盘中收集的大量图片

AKHYui2021-10-12 11:50:00其他
平时刷推和各种图片网站收集了大量图片,舍不得删除全存进了硬盘,大概已经达到了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:数据库名

Last Updated 9/17/2025, 7:13:55 AM