【发布时间】:2020-08-17 10:49:00
【问题描述】:
在一个 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() 问题之外,我有两种方法可以做到这一点。一种是读取所有文件,如果它们存在于专辑表中,则通过查询将它们插入。另一个如上所示是通过查询从相册表中获取文件列表,然后从文件系统中查找并插入这些图像。执行后者(理论上)可以防止它插入不应该在相册中的杂散照片。
虽然我没有在这里展示它是因为我在发布问题后才意识到这一点,但这样做也可以让我从相册表中获取描述列,这样我就可以分辨出哪张图片是哪张。
【问题讨论】:
-
你的表结构是什么样的?
-
您正在查询专辑表?为什么?
-
了解 sql 注入以及准备好的和绑定的查询的重要性 - 我很欣赏它是一个 Intranet 站点,但事实仍然是代码被从一个地方复制和粘贴到另一个地方,真的没有任何借口编写不安全的代码
-
图像表中是否已经存在包含图像的非缩略图版本的行,或者这应该只加载缩略图?