在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()问题之外,我有两种方法可以做到这一点。一种是读取所有文件,如果它们存在于相册表中,则通过查询将它们插入。如上所示,其他 是通过查询从专辑表中获取文件列表,然后从文件系统中查找并插入这些图像。进行后者(理论上)可以防止它插入本来不应该在相册中的杂散照片。
虽然我没有在这里显示它,因为我在发布问题后才意识到它,但这样做也可以让我从专辑表中获取“描述”列,以便我可以分辨出哪个图像。
答案 0 :(得分:0)
很难确定,因为您使用的是带有某些奇怪参数约定的数据库包装程序。通常,您不会使用LOAD_FILE,而是使用php将文件读取到变量中,并使用mysql客户端api保存每一行。
LOAD_FILE可以工作,但是它必须是文件的确切路径,并且有效的Web服务器用户(运行Web服务器的用户)必须具有您尝试读取的目录的权限。
假设这是正确的,类似这样的方法应该起作用:
data(mtcars)
mtcars[-1, ] # removes the first row
mtcars[-c(1, 3, 5),] # removes the first, third and fifth row
mtcars[-c(1, 3, 5), c(1,2)] # removes the first, third, fifth rows, select 1st and 2nd column
此代码假定thumbNail目录是路径目录的子目录。输入的路径目录必须带有斜杠。
潜在问题:
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;
函数出了问题,您怎么知道?好
DBConnect()
不起作用
/somepath/to/directory/