自动发帖软件
标题:
AIWROK手机数据库MySQL数据库截图片批量上传操作脚本
[打印本页]
作者:
发帖软件
时间:
4 小时前
标题:
AIWROK手机数据库MySQL数据库截图片批量上传操作脚本
AIWROK手机数据库MySQL数据库截图片批量上传操作脚本
2.png
(911.99 KB, 下载次数: 0)
4 小时前
上传
//🍎交流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[i]);
}
}
fis.close();
var bytes = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, byteBuffer.length);
for (var i = 0; i < byteBuffer.length; i++) {
bytes[i] = byteBuffer[i];
}
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[i];
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[j]);
}
}
// ========== 方式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("===== 数据库图片上传操作脚本结束 =====");
/**
* 💡 使用说明:
*
* 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. 适用场景:
* - 用户头像存储
* - 商品图片管理
* - 截图自动备份
* - 图片数据迁移
*/
复制代码
欢迎光临 自动发帖软件 (http://www.fatiegongju.com/)
Powered by Discuz! X3.2