我想将网站用户上传的文件保存到我的数据库中。我已经使用longblob(二进制)完成了这项工作,但我感兴趣的是保存上传文件的路径。
这是我的代码,我应该执行哪些修改?
<?php require_once('Connections/databasestudents.php'); ?>
<?php
$fileName = $_FILES['file']['name'];
$tmpName = $_FILES['file']['tmp_name'];
$fileSize = $_FILES['file']['size'];
$fileType = $_FILES['file']['type'];
$fp = fopen($tmpName, 'r');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content);
$studentId = $_POST['studentId'];
fclose($fp);
$query = "INSERT INTO file (studentId, fileName, fileType, fileContent ) ".
"VALUES ('$studentId', '$fileName', '$fileType', '$content')";
mysql_select_db($database_databasestudents, $databasestudents);
mysql_query($query) or die('Error, query failed');
header("Location: students.php");
die();
?>
这还没有为生产做好代码准备。
考虑到这一点,基本上您需要的是使用move_uploaded_file
上传文件。使用代码的一个基本片段是:
require_once('Connections/databasestudents.php');
if($_FILES)
{
$fileName = $_FILES['file']['name'];
$tmpName = $_FILES['file']['tmp_name'];
$fileSize = $_FILES['file']['size'];
$fileType = $_FILES['file']['type'];
// $fp = fopen($tmpName, 'r');
// $content = fread($fp, filesize($tmpName));
// $content = addslashes($content);
if(move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']))
{
$studentId = $_POST['studentId'];
// fclose($fp);
$query = "INSERT INTO file (studentId, fileName, fileType, fileContent ) ".
"VALUES ('$studentId', '$fileName', '$fileType', '$content')";
mysql_select_db($database_databasestudents, $databasestudents);
mysql_query($query) or die('Error, query failed');
header("Location: students.php");
die();
}
}
只有两件事:
- 与其读取上传文件的内容,不如将临时文件复制到其最终位置。此处详细讨论
- 您应该存储文件名或临时文件复制到的路径,而不是插入文件的内容
这里最大的挑战可能是如何处理文件名冲突(当上传两个同名文件时会发生什么)。如何处理这种情况完全取决于应用程序。当所有文件都应该存储时,即使它们的文件名与以前上传的文件名相同,您也可以随时为文件名添加一个格式化的时间戳,或添加一些其他使其唯一的数据(我以前使用过日期和PID的组合)