【发布时间】:2015-02-17 08:29:16
【问题描述】:
我必须使用 PHP 将旧数据库迁移到 MySQL。旧系统的组件之一是一个大的(>1000 个)附加文件列表(大部分是 .pdf,有些是 .doc/.docx)。
到目前为止,我已经完成了以下工作:
- 已创建 mysql 表,其中包含一个包含文件的 blob(此方法有 出于正当理由被选中)
- 导入除附件外的所有数据
- 将所有附件提取到一个文件夹中,为每个文件命名一个唯一的名称
- 在 mysql 中添加并填充了包含附件唯一名称的列
- 创建了一个包含文件夹中所有附件全名的文件。
添加单个文件是我在堆栈中找到的唯一解决方案
但我的要求是递归地遍历文件名列表并在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