下载文件/文档时PHP/SQL问题

下载文件/文档时PHP/SQL问题,php,mysql,database,blob,Php,Mysql,Database,Blob,我的数据库中上载的文件有一些问题。 我将我的文件(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

我的数据库中上载的文件有一些问题。 我将我的文件(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打开它(它是一个文档文件),但其中的文本如下所示:

我做错了什么


PS:用来帮助我的

在fread中,将“r”更改为“rb”以获得“二进制”模式。这将避免在Windows中损坏CR和LF


如需进一步检查,请查看文件和mediumblob中的字节数(使用LENGTH()。如果它们不匹配,则仍然有问题。

在fread中,将“r”更改为“rb”以获得“二进制”模式。这将避免在Windows中损坏CR和LF


如需进一步检查,请查看文件和mediumblob中的字节数(使用LENGTH()。如果它们不匹配,则仍然有问题。

我认为将文件内容上载到数据库不是一个好做法。您最好创建一个上载目录。后者可能更难,但在将来不会给你带来太多麻烦。@CholNhial我认为使用数据库存储文件比只在目录中上传文件要好,因为它更薄!不,它不薄。它还将增加数据库的额外开销,数据库服务器必须传输的大量数据阻塞了管道。您最好将其存储在一个目录中,并保存到数据库的路径。它将允许Web服务器在内存中缓存经常请求的文档,这将有所帮助。@Tschallacka我想我会这样做的!;)谢谢,我想应该对它进行解密,我确实使用了保存jpeg并检索它的方法,就像**src=“data:image/jpeg;base64.”.base64_encode($theuser->infos['user_image'])。“**我认为将文件内容上传到数据库不是一个好做法。您最好创建一个上载目录。后者可能更难,但在将来不会给你带来太多麻烦。@CholNhial我认为使用数据库存储文件比只在目录中上传文件要好,因为它更薄!不,它不薄。它还将增加数据库的额外开销,数据库服务器必须传输的大量数据阻塞了管道。您最好将其存储在一个目录中,并保存到数据库的路径。它将允许Web服务器在内存中缓存经常请求的文档,这将有所帮助。@Tschallacka我想我会这样做的!;)谢谢我想它应该被解密,我确实使用了保存jpeg并检索它的方法,就像**src=“data:image/jpeg;base64.”.base64_encode($theuser->infos['user_image'])。“**非常感谢您的回答。我终于使用了上传目录!非常感谢你的回答。我终于使用了上传目录!