【发布时间】:2018-02-10 07:41:05
【问题描述】:
我的数据库中上传的文件有一些问题。 我将我的文件(doc、img、...)上传到我的数据库中:
CREATE TABLE IF NOT EXISTS `pj` (
id bigint(20) NOT NULL AUTO_INCREMENT,
name varchar(30) NOT NULL,
type varchar(30) NOT NULL,
size int(11) NOT NULL,
content mediumblob NOT NULL,
id_demande int(100) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FK_pj_id_demande` (`id_demande`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
我使用这个 PHP 代码上传:
if($_FILES['userfile']['size'] > 0)
{
$fileName = $_FILES['userfile']['name'];
$tmpName = $_FILES['userfile']['tmp_name'];
$fileSize = $_FILES['userfile']['size'];
$fileType = $_FILES['userfile']['type'];
$fp = fopen($tmpName, 'r');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content);
fclose($fp);
if(!get_magic_quotes_gpc())
{
$fileName = addslashes($fileName);
}
$query = "INSERT INTO pj (name, type, size, content, id_demande) VALUES ('$fileName', '$fileType', '$fileSize', '$content', $queryID)";
$resultQ =mysqli_query($con, $query);
}
下载后我用这个:
$sqlPJ = "SELECT name, type, size, content FROM pj WHERE id_demande = 1";
$queryPJ = $db->prepare($sqlPJ);
$queryPJ->execute();
$resultPJ = $queryPJ->fetchAll( PDO::FETCH_ASSOC );
foreach($resultPJ as $rowPJ){
$size = $rowPJ['size'];
$type = $rowPJ['type'];
$name = $rowPJ['name'];
header("Content-length: $size");
header("Content-type: $type");
header("Content-Disposition: attachment; filename=$name");
echo $rowPJ['content'];
}
之后,我的浏览器询问我是否要使用 Office Word(它是一个 doc 文件)打开它,但其中的文本如下所示:
我做错了什么?
PS : 使用this tutorial 来帮助我!
【问题讨论】:
-
我认为将文件内容上传到数据库不是一个好习惯。你最好创建一个上传目录。后面可能会更难,但以后不会让你头疼。
-
@CholNhial 我认为使用数据库存储文件比只在目录中上传文件更好,因为它更薄!
-
不,它并不薄。它还会给数据库增加额外的开销,数据库服务器必须传输的大量数据堵塞管道。你最好将它存储在一个目录中,并保存到数据库的路径。它将允许网络服务器在内存中缓存经常请求的文档,这将有所帮助。
-
@Tschallacka 我想我会这样做的! ;) 谢谢
-
我猜它应该被解密,我确实使用保存 jpeg 的方式并像 ** src="data:image/jpeg;base64,'.base64_encode($theuser->infos[ 'user_image']).'" **