php - 将多个图像路径插入多列
问题描述
在一个 Intranet 站点上,我将很多图像从文件系统移动到 MySQL,并编写了一个小函数来提供帮助。没有错误,但也没有插入图像,因此我需要帮助弄清楚如何在没有 LOAD_FILE() 的情况下执行此操作,因为它需要我无法更改文件夹和文件权限。
请注意,有必要查询专辑表,以便可以将专辑表中的主键与图像一起插入,以便显示专辑的程序知道要加载哪个图像。
function uploadFolder($path,$thumbpath) {
// Use form to submit path (keeps process from running automatically when loaded)
if (isset($_POST['create']) && isset($path)) :
global $siteDB;
// Fetch image names from existing albums
$sqlAlbum = "SELECT ID, ImageName FROM albums ORDER BY ImageName";
$sqlRow = DBConnect($sqlAlbum, "Multiple", $siteDB, "assoc");
// Build queries to insert all images to table
foreach ($sqlRow as $row) :
$filename = basename($row['ImageName']);
$albumID = $row['ID'];
$pathname = $path.$filename;
$sqlUpload = "INSERT INTO images (`ImageName`,`AlbumID`,`ImageFull`) VALUES ('$filename', $albumID, LOAD_FILE('$pathname'))";
// Run the query for each file
DBConnect($sqlUpload,"Run", $siteDB);
endforeach;
// FOR TEST PURPOSES ONLY
$_SESSION['testSQL'] = $sqlUpload;
endif;
}
它被调用:
if (isset($_POST)) :
$path = (isset($_POST['path'])) ? $_POST['path'] : "";
uploadFolder($path,"thumbnails");
endif;
图片表并不多,但供参考:
CREATE TABLE IF NOT EXISTS `images` (
`ID` int unsigned NOT NULL AUTO_INCREMENT,
`ImageName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`AlbumID` int unsigned DEFAULT NULL,
`ImageFull` blob,
`ImageThumb` blob,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=228 DEFAULT CHARSET=utf8;
除了 LOAD_FILE() 问题,我有两种方法可以做到这一点。一种是读取所有文件,如果它们存在于专辑表中,则通过查询将它们插入。我上面展示的另一个是通过查询从相册表中获取文件列表,然后从文件系统中查找并插入这些图像。做后者(理论上)可以防止它插入不应该在相册中的杂散照片。
虽然我没有在这里展示它,因为我在发布问题后意识到了这一点,但做后者也可以让我从相册表中获取描述列,这样我就可以分辨出哪个图像是哪个。
解决方案
很难确定,因为您正在使用某种带有一些奇怪参数约定的数据库包装器。通常,您不会使用 LOAD_FILE,而是使用 php 将文件读取到变量中并使用 mysql 客户端 api 来保存每一行。
LOAD_FILE 可以工作,但它必须是文件的确切路径,并且有效的网络服务器用户(运行网络服务器的用户)必须对您尝试读取的目录具有权限。
假设这是真的,这样的事情应该有效:
foreach ($sqlRow as $row) :
$filename = basename($row['ImageName']);
$albumID = $row['ID'];
$pathname = $path.$filename;
$thumbPathname = $path . $thumbpath . DIRECTORY_SEPARATOR . $filename
$sqlUpload = "INSERT INTO images (`ImageName`,`AlbumID`,`ImageFull`,`ImageThumb`) VALUES ('$filename', $albumID, LOAD_FILE('$pathname'), LOAD_FILE('$thumbPathname'));\n";
// Run the query for each file
DBConnect($sqlUpload,"Run", $siteDB);
endforeach;
此代码假定 thumbNail 目录是路径目录的子目录。路径目录需要使用尾部斜杠输入。
潜在问题:
- SQL 语句有一个分号和一个换行符。我从未见过包含这些的数据库客户端调用。MySQL 客户端库不使用这些,所以我不确定为什么它们会成为 DB 包装器的一部分。
- 这里没有错误检查代码。如果
DBConnect()
函数出现问题,你怎么知道? - 路径变量必须是完整的并且必须有一个结束分隔符。
好的
/somepath/to/directory/
行不通
/somepath/to/directory
推荐阅读
- python - 带有Tkinter和openCV的图像编辑软件,以及如何制作一个达到功能并显示它的按钮
- python - Tkinter 登录表单
- assembly - 在 32 位机器中取反 64 位数字
- python - Pythong梯度下降线性回归计算不好
- javascript - 使用 parentElement.nextSiblingElement 时,JavaScript 无法读取未定义的属性“样式”
- excel - Excel - 如果满足表 B 中的条件,如何对表 A 中的行求和
- javascript - 区分发布请求
- javascript - 如何同时获取 isActive true 和 false
- java - 调用布尔表达式方法的问题
- c# - SQL查询执行顺序