将多个图像路径插入多列

时间:2020-05-03 00:12:35

标签: php mysql mysqli blob

在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()问题之外,我有两种方法可以做到这一点。一种是读取所有文件,如果它们存在于相册表中,则通过查询将它们插入。如上所示,其他 是通过查询从专辑表中获取文件列表,然后从文件系统中查找并插入这些图像。进行后者(理论上)可以防止它插入本来不应该在相册中的杂散照片。

虽然我没有在这里显示它,因为我在发布问题后才意识到它,但这样做也可以让我从专辑表中获取“描述”列,以便我可以分辨出哪个图像。

1 个答案:

答案 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目录是路径目录的子目录。输入的路径目录必须带有斜杠。

潜在问题:

  1. SQL语句具有分号和换行符。我从未见过包含这些客户端的数据库客户端调用。 MySQL客户端库不使用这些库,因此我不确定为什么它们会成为数据库包装器的一部分。
  2. 这里没有错误检查代码。如果 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; 函数出了问题,您怎么知道?
  3. 路径变量必须完整,并且必须具有结束符。

DBConnect()

不起作用

/somepath/to/directory/
相关问题