YYPOST群发软件 发表于 2025-12-29 09:46:44

AIWROK手机数据库MySQL数据库截图片批量上传操作脚本


AIWROK手机数据库MySQL数据库截图片批量上传操作脚本


//🍎交流QQ群711841924群一,苹果内测群,528816639
// AIWROK软件数据库图片批量上传操作脚本
// 实现读取本地图片、转换为Base64、上传到数据库、以及从数据库还原图片的功能

print.log("===== 数据库图片上传操作脚本开始 =====");

var conn = null;
var pstmt = null;

/**
* Java原生方法:将文件转换为Base64字符串
*/
function fileToBase64(filePath) {
    try {
      var file = new java.io.File(filePath);
      if (!file.exists()) {
            return null;
      }
      
      var fis = new java.io.FileInputStream(file);
      var buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 1024);
      var bytesRead = 0;
      var byteBuffer = [];
      
      while ((bytesRead = fis.read(buffer)) != -1) {
            for (var i = 0; i < bytesRead; i++) {
                byteBuffer.push(buffer);
            }
      }
      
      fis.close();
      
      var bytes = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, byteBuffer.length);
      for (var i = 0; i < byteBuffer.length; i++) {
            bytes = byteBuffer;
      }
      
      return android.util.Base64.encodeToString(bytes, android.util.Base64.NO_WRAP);
    } catch (e) {
      print.log("❌ 文件转Base64失败: " + e.message);
      return null;
    }
}

/**
* Java原生方法:检查文件是否存在
*/
function fileExists(filePath) {
    return new java.io.File(filePath).exists();
}

/**
* Java原生方法:获取文件大小
*/
function fileLength(filePath) {
    return new java.io.File(filePath).length();
}

/**
* Java原生方法:获取文件名
*/
function getFileName(filePath) {
    return new java.io.File(filePath).getName();
}

/**
* 连接数据库
*/
function connectDatabase() {
    try {
      var url = "jdbc:mysql://38.12.31.15:3306/dddfguu";
      var user = "dddfguu";
      var password = "rAXyhnNkiNsChJ8e";
      var params = "?useSSL=false&characterEncoding=utf8&connectTimeout=5000";
      
      print.log("正在连接数据库...");
      conn = mysql.getConnection(url, user, password);
      print.log("✅ 数据库连接成功");
      return true;
    } catch (e) {
      print.log("❌ 数据库连接失败: " + e.message);
      return false;
    }
}

/**
* 创建图片存储表
*/
function createImageTable() {
    try {
      var sql = "CREATE TABLE IF NOT EXISTS images (" +
                  "id INT AUTO_INCREMENT PRIMARY KEY, " +
                  "name VARCHAR(255) NOT NULL, " +
                  "path VARCHAR(500), " +
                  "image_data LONGBLOB, " +
                  "file_size INT, " +
                  "image_width INT, " +
                  "image_height INT, " +
                  "mime_type VARCHAR(50), " +
                  "created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP" +
                  ")";
      
      var stmt = conn.createStatement();
      stmt.execute(sql);
      stmt.close();
      
      print.log("✅ 图片存储表创建成功(或已存在)");
      return true;
    } catch (e) {
      print.log("❌ 创建图片表失败: " + e.message);
      return false;
    }
}

/**
* 检查表是否存在并显示表结构
*/
function checkTableStructure() {
    try {
      var sql = "SHOW TABLES LIKE 'images'";
      var stmt = conn.createStatement();
      var rs = stmt.executeQuery(sql);
      
      if (rs.next()) {
            print.log("✅ 表 images 已存在");
            rs.close();
            stmt.close();
            
            // 显示表结构
            sql = "DESCRIBE images";
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
            
            print.log("表 images 的字段结构:");
            while (rs.next()) {
                var columnName = rs.getString(1);
                var columnType = rs.getString(2);
                print.log("- " + columnName + ": " + columnType);
            }
            rs.close();
            stmt.close();
            return true;
      } else {
            print.log("❌ 表 images 不存在,需要先创建表");
            rs.close();
            stmt.close();
            return false;
      }
    } catch (e) {
      print.log("❌ 检查表结构失败: " + e.message);
      return false;
    }
}

/**
* 获取图片文件信息
*/
function getImageInfo(imagePath) {
    try {
      if (!fileExists(imagePath)) {
            print.log("❌ 图片文件不存在: " + imagePath);
            return null;
      }
      
      var fileSize = fileLength(imagePath);
      var fileName = getFileName(imagePath);
      var extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();
      
      var mimeType = "image/jpeg";
      if (extension === "png") {
            mimeType = "image/png";
      } else if (extension === "gif") {
            mimeType = "image/gif";
      } else if (extension === "webp") {
            mimeType = "image/webp";
      }
      
      print.log("图片文件信息:");
      print.log("路径: " + imagePath);
      print.log("文件名: " + fileName);
      print.log("文件大小: " + (fileSize / 1024).toFixed(2) + " KB");
      print.log("MIME类型: " + mimeType);
      
      return {
            path: imagePath,
            name: fileName,
            size: fileSize,
            mimeType: mimeType
      };
    } catch (e) {
      print.log("❌ 获取图片信息失败: " + e.message);
      return null;
    }
}

/**
* 将本地图片上传到数据库
* @param {String} imagePath - 图片本地路径
* @param {String} imageName - 图片名称(可选,默认使用文件名)
*/
function uploadImageToDatabase(imagePath, imageName) {
    try {
      var imageInfo = getImageInfo(imagePath);
      if (!imageInfo) {
            return false;
      }
      
      var name = imageName || imageInfo.name;
      
      // 将图片文件转换为Base64字符串
      print.log("正在将图片转换为Base64字符串...");
      var base64Data = fileToBase64(imagePath);
      
      if (!base64Data) {
            print.log("❌ 图片转Base64失败");
            return false;
      }
      
      print.log("✅ Base64字符串生成成功,长度: " + base64Data.length + " 字符");
      
      // 将Base64字符串转换为字节数组
      // 格式: "data:image/jpeg;base64,..." 需要去除前缀
      var base64Content = base64Data;
      var prefix = "data:" + imageInfo.mimeType + ";base64,";
      if (base64Data.indexOf(prefix) === 0) {
            base64Content = base64Data.substring(prefix.length);
      }
      
      // 使用预编译语句插入图片数据
      var sql = "INSERT INTO images (name, path, image_data, file_size, mime_type) VALUES (?, ?, ?, ?, ?)";
      pstmt = conn.prepareStatement(sql);
      pstmt.setString(1, name);
      pstmt.setString(2, imagePath);
      
      // 设置BLOB参数 - 使用setBytes方法
      var bytes = android.util.Base64.decode(base64Content, android.util.Base64.NO_WRAP);
      pstmt.setBytes(3, bytes);
      
      pstmt.setInt(4, imageInfo.size);
      pstmt.setString(5, imageInfo.mimeType);
      
      var rowsAffected = pstmt.executeUpdate();
      pstmt.close();
      pstmt = null;
      
      if (rowsAffected > 0) {
            print.log("✅ 图片 '" + name + "' 上传成功,影响行数: " + rowsAffected);
            return true;
      } else {
            print.log("❌ 图片上传失败,影响行数为0");
            return false;
      }
    } catch (e) {
      print.log("❌ 上传图片到数据库失败: " + e.message);
      if (pstmt) {
            try { pstmt.close(); } catch(err) {}
            pstmt = null;
      }
      return false;
    }
}

/**
* 从数据库下载图片并保存到本地
* @param {Number} imageId - 数据库中的图片ID
* @param {String} outputPath - 保存路径
*/
function downloadImageFromDatabase(imageId, outputPath) {
    try {
      var sql = "SELECT name, image_data, mime_type FROM images WHERE id = ?";
      pstmt = conn.prepareStatement(sql);
      pstmt.setInt(1, imageId);
      
      var rs = pstmt.executeQuery();
      
      if (rs.next()) {
            var name = rs.getString("name");
            var imageData = rs.getBytes("image_data");
            var mimeType = rs.getString("mime_type");
            
            // 将字节数组转换为Base64字符串
            var base64Content = android.util.Base64.encodeToString(imageData, android.util.Base64.NO_WRAP);
            
            // 添加Base64前缀
            var prefix = "data:" + mimeType + ";base64,";
            var base64WithPrefix = prefix + base64Content;
            
            // 使用 new image().readBase64() 和 save() 保存为文件
            var imageObj = new image();
            imageObj.readBase64(base64WithPrefix);
            imageObj.save(outputPath);
            
            print.log("✅ 图片下载成功: " + outputPath);
            print.log("图片名称: " + name);
            print.log("MIME类型: " + mimeType);
            print.log("文件大小: " + (imageData.length / 1024).toFixed(2) + " KB");
            
            rs.close();
            pstmt.close();
            pstmt = null;
            
            return true;
      } else {
            print.log("❌ 未找到ID为 " + imageId + " 的图片");
            rs.close();
            pstmt.close();
            pstmt = null;
            return false;
      }
    } catch (e) {
      print.log("❌ 从数据库下载图片失败: " + e.message);
      if (pstmt) {
            try { pstmt.close(); } catch(err) {}
            pstmt = null;
      }
      return false;
    }
}

/**
* 查询数据库中所有图片信息
*/
function queryAllImages() {
    try {
      var sql = "SELECT id, name, path, file_size, mime_type, created_at FROM images ORDER BY id";
      var stmt = conn.createStatement();
      var rs = stmt.executeQuery(sql);
      
      print.log("数据库中的图片列表:");
      var count = 0;
      
      while (rs.next()) {
            count++;
            var id = rs.getInt("id");
            var name = rs.getString("name");
            var path = rs.getString("path");
            var fileSize = rs.getInt("file_size");
            var mimeType = rs.getString("mime_type");
            var createdAt = rs.getString("created_at");
            
            print.log("[" + id + "] " + name);
            print.log("      大小: " + (fileSize / 1024).toFixed(2) + " KB");
            print.log("      类型: " + mimeType);
            print.log("      创建时间: " + createdAt);
      }
      
      rs.close();
      stmt.close();
      
      if (count === 0) {
            print.log("数据库中没有图片记录");
      } else {
            print.log("共 " + count + " 张图片");
      }
      
      return true;
    } catch (e) {
      print.log("❌ 查询图片列表失败: " + e.message);
      return false;
    }
}

/**
* 根据ID删除图片
*/
function deleteImageFromDatabase(imageId) {
    try {
      var sql = "DELETE FROM images WHERE id = ?";
      pstmt = conn.prepareStatement(sql);
      pstmt.setInt(1, imageId);
      
      var rowsAffected = pstmt.executeUpdate();
      pstmt.close();
      pstmt = null;
      
      if (rowsAffected > 0) {
            print.log("✅ 成功删除ID为 " + imageId + " 的图片,影响行数: " + rowsAffected);
            return true;
      } else {
            print.log("❌ 未找到ID为 " + imageId + " 的图片");
            return false;
      }
    } catch (e) {
      print.log("❌ 删除图片失败: " + e.message);
      if (pstmt) {
            try { pstmt.close(); } catch(err) {}
            pstmt = null;
      }
      return false;
    }
}

/**
* 实时截图并上传到数据库
* @param {String} imageName - 图片名称(可选)
* @returns {Boolean} 是否成功
*/
function screenshotAndUpload(imageName) {
    try {
      print.log("\n===== 实时截图并上传 =====");
      
      // 1. 截图
      print.log("正在截取屏幕...");
      var screenshot = screen.screenShotFull();
      
      if (!screenshot) {
            print.log("❌ 截图失败");
            return false;
      }
      
      print.log("✅ 截图成功");
      
      // 2. 生成本地保存路径
      var timestamp = new java.util.Date().getTime();
      var localPath = "/sdcard/screenshot_" + timestamp + ".jpg";
      
      // 3. 保存到本地
      print.log("正在保存截图到本地: " + localPath);
      screenshot.save(localPath);
      
      if (!fileExists(localPath)) {
            print.log("❌ 本地保存失败");
            return false;
      }
      
      print.log("✅ 本地保存成功");
      
      // 4. 上传到数据库
      var name = imageName || "截图_" + timestamp;
      print.log("正在上传到数据库: " + name);
      
      var uploadResult = uploadImageToDatabase(localPath, name);
      
      if (uploadResult) {
            print.log("✅ 实时截图上传成功!");
            return true;
      } else {
            print.log("❌ 数据库上传失败,但本地图片已保存");
            return false;
      }
    } catch (e) {
      print.log("❌ 实时截图上传失败: " + e.message);
      return false;
    }
}

/**
* 定时截图并上传(循环执行)
* @param {Number} intervalSeconds - 间隔秒数
* @param {Number} maxCount - 最大执行次数(0表示无限循环)
*/
function autoScreenshotUpload(intervalSeconds, maxCount) {
    try {
      print.log("\n===== 启动定时截图上传 =====");
      print.log("间隔: " + intervalSeconds + " 秒");
      print.log("最大次数: " + (maxCount === 0 ? "无限" : maxCount));
      
      var count = 0;
      
      while (maxCount === 0 || count < maxCount) {
            count++;
            print.log("\n--- 第 " + count + " 次截图 ---");
            
            var result = screenshotAndUpload("定时截图_" + count);
            
            if (result) {
                print.log("✅ 第 " + count + " 次成功");
            } else {
                print.log("❌ 第 " + count + " 次失败");
            }
            
            // 等待间隔(不包括最后一次)
            if (maxCount === 0 || count < maxCount) {
                print.log("等待 " + intervalSeconds + " 秒后进行下一次截图...");
                sleep(intervalSeconds * 1000);
            }
      }
      
      print.log("\n===== 定时截图任务完成 =====");
      print.log("共执行 " + count + " 次截图上传");
      return true;
    } catch (e) {
      print.log("❌ 定时截图任务失败: " + e.message);
      return false;
    }
}

/**
* 截图并获取Base64数据(不上传,用于预览等)
* @returns {String} Base64字符串,失败返回null
*/
function screenshotToBase64() {
    try {
      print.log("\n===== 截图并获取Base64 =====");
      
      // 1. 截图
      var screenshot = screen.screenShotFull();
      if (!screenshot) {
            print.log("❌ 截图失败");
            return null;
      }
      
      // 2. 转为Base64
      var base64Data = screenshot.toBase64();
      
      if (base64Data) {
            print.log("✅ Base64数据获取成功,长度: " + base64Data.length + " 字符");
            print.log("前缀: " + base64Data.substring(0, 50) + "...");
            return base64Data;
      } else {
            print.log("❌ Base64转换失败");
            return null;
      }
    } catch (e) {
      print.log("❌ 截图转Base64失败: " + e.message);
      return null;
    }
}

/**
* 关闭数据库连接
*/
function closeConnection() {
    try {
      if (pstmt != null) {
            pstmt.close();
            pstmt = null;
      }
      if (conn != null) {
            conn.close();
      }
      print.log("✅ 数据库连接已关闭");
    } catch (e) {
      print.log("❌ 关闭连接时出错: " + e.message);
    }
}

// 主程序执行流程
try {
    // 1. 连接数据库
    if (!connectDatabase()) {
      throw new Error("数据库连接失败");
    }
   
    // 2. 检查表是否存在,不存在则创建
    if (!checkTableStructure()) {
      print.log("正在创建图片存储表...");
      if (!createImageTable()) {
            throw new Error("创建图片表失败");
      }
    }
   
    // ========== 方式1:上传本地已有图片 ==========
    print.log("\n===== 方式1:上传本地图片 =====");
   
    // 常见的手机图片路径示例
    var sampleImagePaths = [
      "/sdcard/DCIM/Camera/photo_001.jpg",
      "/sdcard/Pictures/Screenshots/screenshot_001.png",
      "/sdcard/Download/image_001.jpg"
    ];
   
    // 使用第一个存在的图片路径
    var uploadPath = null;
    for (var i = 0; i < sampleImagePaths.length; i++) {
      var testPath = sampleImagePaths;
      if (new java.io.File(testPath).exists()) {
            uploadPath = testPath;
            print.log("找到可用的测试图片: " + uploadPath);
            break;
      }
    }
   
    if (uploadPath) {
      // 上传找到的图片
      uploadImageToDatabase(uploadPath, "本地测试图片_" + new java.util.Date().getTime());
    } else {
      print.log("⚠️ 未找到测试图片,请确保以下路径有图片文件:");
      for (var j = 0; j < sampleImagePaths.length; j++) {
            print.log("- " + sampleImagePaths);
      }
    }
   
    // ========== 方式2:实时截图并上传 ==========
    print.log("\n===== 方式2:实时截图并上传 =====");
   
    // 立即截图并上传
    var screenshotResult = screenshotAndUpload("实时截图测试");
   
    // ========== 方式3:定时截图上传(可选) ==========
    // 如果需要定时截图,请取消注释以下代码:
    // autoScreenshotUpload(5, 3);// 每5秒截图一次,共3次
   
    // 4. 查询所有图片
    print.log("\n===== 查询数据库中的图片 =====");
    queryAllImages();
   
    // 5. 下载最新图片
    print.log("\n===== 从数据库下载最新图片 =====");
    // 查找最新的图片ID
    var latestImageId = 0;
    try {
      var sql = "SELECT MAX(id) as max_id FROM images";
      var stmt = conn.createStatement();
      var rs = stmt.executeQuery(sql);
      if (rs.next()) {
            latestImageId = rs.getInt("max_id");
      }
      rs.close();
      stmt.close();
      
      if (latestImageId > 0) {
            var downloadPath = "/sdcard/downloaded_image_" + latestImageId + ".jpg";
            downloadImageFromDatabase(latestImageId, downloadPath);
            
            // 6. 截图转Base64演示
            print.log("\n===== 截图转Base64演示 =====");
            var base64Data = screenshotToBase64();
            if (base64Data) {
                print.log("✅ Base64可用于H5界面显示、网络传输等");
            }
            
            // 7. 删除图片演示(取消注释可删除)
            // print.log("\n===== 删除图片演示 =====");
            // deleteImageFromDatabase(latestImageId);
            // print.log("已删除ID为 " + latestImageId + " 的图片");
      }
    } catch (e) {
      print.log("⚠️ 演示下载功能时出错: " + e.message);
    }
   
    // 8. 再次查询确认
    print.log("\n===== 最终图片列表 =====");
    queryAllImages();
   
} catch (e) {
    print.log("❌ 程序执行过程中发生错误: " + e.message);
} finally {
    // 确保连接被关闭
    closeConnection();
}

print.log("===== 数据库图片上传操作脚本结束 =====");

/**
* &#128161; 使用说明:
*
* 1. 图片存储原理:
*    - 使用 MySQL 的 LONGBLOB 类型存储二进制图片数据
*    - 将图片文件转为 Base64 字符串,再转为字节数组存入数据库
*
* 2. 上传流程:
*    - file.fileToBase64(path) → 获取图片Base64字符串
*    - android.util.Base64.decode() → Base64转字节数组
*    - prepareStatement.setBytes() → 存入数据库
*
* 3. 下载流程:
*    - rs.getBytes() → 从数据库读取字节数组
*    - android.util.Base64.encodeToString() → 字节数组转Base64
*    - file.base64ToFile() → 保存为图片文件
*
* 4. 适用场景:
*    - 用户头像存储
*    - 商品图片管理
*    - 截图自动备份
*    - 图片数据迁移
*/


页: [1]
查看完整版本: AIWROK手机数据库MySQL数据库截图片批量上传操作脚本