当前位置: 首页 > 知识库问答 >
问题:

将多个图像路径插入到多个列中

公西宏毅
2023-03-14

在一个Intranet站点上,我正在将相当多的图像从文件系统移动到MySQL中,并编写了一个小函数来提供帮助。没有错误,但插入的图像也没有错误,因此我需要帮助找出如何在不加载_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问题不谈,我有两种方法可以做到这一点。一种方法是读取所有文件,并通过查询将它们插入到相册表中。如上所述,另一个方法是通过查询从相册表中获取文件列表,然后从文件系统中找到并插入这些图像。做后者(理论上)可以防止它插入不应该在相册中的流浪照片。

虽然我没有在这里展示它,因为我在发布问题后意识到了这一点,但做后一步也可以让我从albums表中抓取描述列,这样我就可以分辨出哪个图像是哪个图像。

共有1个答案

于飞飙
2023-03-14

很难确定,因为您使用的是某种数据库包装器,带有一些奇怪的参数约定。通常情况下,您不会使用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;

此代码假定缩略图目录是路径目录的子目录。路径目录需要用尾随斜杠输入。

潜在问题:

  1. SQL语句有一个分号和一个换行符。我从未见过数据库客户端调用会包括这些。MySQL客户端库不使用这些,所以我不确定为什么它们会成为数据库包装器的一部分。
  2. 这里没有错误检查代码。如果DBConnect()函数出错,您将如何知道?
  3. 路径变量必须是完整的,并且必须有一个结束分隔符。

好的

/somepath/to/directory/

不会管用的

/somepath/to/directory
 类似资料:
  • 问题内容: 我需要将几个数组合并为一个数组。描述我要寻找的内容的最好方法是将阵列“交织”为单个阵列。 例如,从数组#1中取出第一项,然后追加到最终数组中。从数组2获取项目1,然后追加到最终数组。从数组#1获得第二项并追加…等。 最终的数组如下所示: array#1.element#1 array#2.element#1。。。 “踢球者”是各个阵列可以具有各种长度。 是否有更好的数据结构要使用? 问

  • 你好,我想上传多张图片到firebase。目前我可以上传1张图片。尽管如此,我还是决定将所有内容作为HTML,比如标题、描述和图像,放在一个webview中,并从那里显示出来。目前,这项工作还不错,我在firebase中有一个字符串,包含所有这些内容: 不过,正如您所见,这只是本地存储的工作形式。如何下载这些图像并用正确的firebase图像URL替换图像src。

  • 我正在寻找帮助开发(或一个库),可以让我合并在一起的多个图像到一个ImageView。 我的应用程序将用户之间的交互组合在一起,而不是单独地显示它们,因此我希望合并它们的所有化身,这样一个适配器单元格就可视化了一个“组”。 Facebook.com的聊天就是一个很好的例子: 我的问题是,我如何在Android/Java中提供这个功能?据推测,它的图像数量可能介于1到4之间。请告诉我您能给出的任何建

  • 问题内容: 可以做这样的事情吗? 我正在使用RESTEasy。 问题答案: 是的,您可以这样做,尽管您将必须重命名方法,以使它们的签名不同。 更新: 检查Dieter Cailliau的答案, 可能是您想要的… 您可以在其中检查JSR-311的API及其参考实现,名称为“ jersey”: JSR311 API 泽西岛

  • 问题内容: 我正在 使用Express Framework 在 Node.js上 编写CMS 。在我的CMS上,我有几个用于用户,页面等的模块。 我希望每个模块的文件都放在 单独的文件夹中 , 包括视图文件 。有人知道我该怎么做到吗? 我将 swig 用作模板引擎,但如果有帮助,可以将其替换为其他东西。 问题答案: 最后更新 自Express 4.10起,框架支持多视图文件夹功能。 只需将一系列位

  • 问题内容: 我正在尝试使用Visual Studio Code,到目前为止,它看起来很棒(轻巧,快速等)。 我正在尝试运行一个使用虚拟环境的Python应用程序,但是还使用了不在我的虚拟环境的站点包中的库。 我知道在中,我可以指定一个设置,该设置已经完成并且指向虚拟环境。 我也知道我可以向添加其他路径,到目前为止,我正在添加外部库。问题是,当我调试时,它失败了,因为没有找到中指定的库。 为此必须使