【问题标题】:add multiple pdf files to blobs usng php使用php将多个pdf文件添加到blob
【发布时间】:2015-02-17 08:29:16
【问题描述】:

我必须使用 PHP 将旧数据库迁移到 MySQL。旧系统的组件之一是一个大的(>1000 个)附加文件列表(大部分是 .pdf,有些是 .doc/.docx)。

到目前为止,我已经完成了以下工作:

  1. 已创建 mysql 表,其中包含一个包含文件的 blob(此方法有 出于正当理由被选中)
  2. 导入除附件外的所有数据
  3. 将所有附件提取到一个文件夹中,为每个文件命名一个唯一的名称
  4. 在 mysql 中添加并填充了包含附件唯一名称的列
  5. 创建了一个包含文件夹中所有附件全名的文件。

添加单个文件是我在堆栈中找到的唯一解决方案

但我的要求是递归地遍历文件名列表并在mysql中找到匹配的行,然后将文件从文件夹插入到blob中

示例 ...

我有一个包含这样条目的文本文件(文件名、创建日期、大小)..

024048DE44C-RUE_MA.pdf,05/24/2013,80233 
024048DE44C-RUE.pdf,06/21/2013,85151 
... (1000 more)

我在文件夹中有一个名为 024048DE44C-RUE_MA.pdf 的文件 我在mysql数据库中有一个行列filename包含024048DE44C-RUE_MA.pdf

我认为解决方案是这样的,但中间需要帮助。

$myfile = fopen("filelist.txt", "r") or die("Unable to open file!");
while(!feof($myfile)) {
$attfile =fgets($myfile);

...上传文件

// Check if a file has been uploaded
    if(isset($_FILES['uploaded_file'])) {
        // Make sure the file was sent without errors
        if($_FILES['uploaded_file']['error'] == 0) {
            // Connect to the database
            $dbLink = new mysqli('localhost', 'root', '', 'dbase');
            if(mysqli_connect_errno()) {
                die("MySQL connection failed: ". mysqli_connect_error());
            }

            // Gather all required data
            $name = $dbLink->real_escape_string($_FILES['uploaded_file']['name']);
            $mime = $dbLink->real_escape_string($_FILES['uploaded_file']['type']);
            $data = $dbLink->real_escape_string(file_get_contents($_FILES  ['uploaded_file']['tmp_name']));
            $size = intval($_FILES['uploaded_file']['size']);

            // Create the SQL query
            $query = "
                INSERT INTO `deal_attachment` (
                    `deal_att_name`, `deal_att_mime`, `deal_att_size`, `deal_att_content`, `deal_att_created`
                )
                VALUES (
                    '{$name}', '{$mime}', {$size}, '{$data}', NOW()
                )";

            // Execute the query
            $result = $dbLink->query($query);

            // Check if it was successfull
            if($result) {
                echo 'Success! Your file was successfully added!';
            }
            else {
                echo 'Error! Failed to insert the file'
                   . "<pre>{$dbLink->error}</pre>";
            }
        }
        else {
            echo 'An error accured while the file was being uploaded. '
               . 'Error code: '. intval($_FILES['uploaded_file']['error']);
        }

        // Close the mysql connection
        $dbLink->close();
    }
    else {
        echo 'Error! A file was not sent!';
    }

    }
fclose($myfile);

【问题讨论】:

  • 服务器上有文件吗?将它们全部发布似乎需要做很多额外的工作,您应该使用 ftp 之类的方式上传它们并改为读取目录。然后你可以在它们被导入后删除它们。
  • 文件已经在服务器上 - 我需要一种方法将它们放入 mysql 表中。此处和其他地方给出的解决方案都具有 HTML
    格式,这不适用于多个实例 - 它们一次只处理一个文件,需要一些用户操作。跨度>

标签: php mysql


【解决方案1】:

如果你已经有一个带有文件名的表,为什么不直接使用 mysql LOAD_FILE 函数?

 UPDATE mytable SET blobdata=LOAD_FILE(concat("/path/to/", filename));

您的文件需要在您的 mysql 服务器上才能正常工作。

如果您唯一的问题是如何读取 CSV 文件,您可以这样做:

 list($filename,$date, $size)=explode(",", $attfile);

【讨论】:

  • 这也是我要尝试的(当然还有适当的 WHERE 子句 ;-))。但首先有相当多的空运行....load_file() 可能是一个暴躁的野兽,请参阅dev.mysql.com/doc/refman/5.0/en/…
  • 我想这就是我一直在寻找的——会尝试的。谢谢
  • 问亚当的问题 - VolkerK 给出的链接说 LOAD_FILE 会将内容转换为字符串 - 这不会丢失 PDF 格式,使文件无法读取吗?
【解决方案2】:

Adam 的建议非常适合我,因为 Windows 中的重要条件是文件路径必须包含双反斜杠(所以你可以像这样构造它 $path = 'c:\\dir\\subdir\\' 。修剪($文件名);。

下面的sn-p代码显示调用..

    $query = "UPDATE `attachments` SET `att_content`=LOAD_FILE('" .$path . "') WHERE `att_name` = '" . $filename ."'" ; 

    $result = mysqli_query($dbcon,$query) ;

// Check if it was successful (maybe add some more insurance by going back to the database to see if the file is there - it can be that no error was reported but LOAD_FILE didn't work (like if the path is invalid)

    if (false === $result) {
         echo mysqli_error($dbcon);
        die ;
    } else  { echo 'Success! Your file was successfully added!'; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-02
    • 2017-12-19
    • 2015-05-07
    • 1970-01-01
    • 2015-03-21
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多