每次我尝试下载时,它都会生成正确的文件名和扩展名(文件),但却损坏了(通常是1kb大小,无法打开,在这种情况下,我的文件是.docx格式,大小约为12kb )。我使用XAMPP,并使用phpmyadmin查看我的sql数据库。上传脚本用于将文件从计算机存储到数据库。
这是我的上传脚本:-根据答案编辑
<?php
session_start();
include("connect.php");
$nametemp=$_SESSION['name'];
$nistemp=$_SESSION['nislogin'];
$subjecttemp=$_SESSION['subject'];
$chapter=$_POST['chapter'];
$name=$_FILES['browsefile']['name'];
$mime=$_FILES['browsefile']['type'];
$data=file_get_contents($_FILES['browsefile']['tmp_name']);
$size=$_FILES['browsefile']['size'];
mysql_query("INSERT INTO assignment (name, mime, size, data, created, uploader, subject, chapter) VALUES ('$name', '$mime', '$size', '$data', NOW(), '$nametemp', '$subjecttemp', '$chapter')");
header("location:subject.php");
die();
?>这是下载脚本:根据答案执行-edited
<?php
session_start();
include("connect.php");
$nametemp=$_SESSION['name'];
$nistemp=$_SESSION['nislogin'];
$classtemp=$_SESSION['class'];
$subjecttemp=$_SESSION['subject'];
$idtemp=$_GET['id'];
$query=("SELECT mime, name, size, data FROM assignment WHERE id='$idtemp'");
$result=mysql_query($query);
$filename=mysql_result($result,0,"name");
$filesize=mysql_result($result,0,"size");
$filemime=$type=mysql_result($result,0,"mime");
$filedata=mysql_result($result,0,"data");
header("Content-disposition: attachment; filename=$filename");
header("Content-length: $filesize");
header("Content-type: $filemime");
header("Content-transfer-encoding: binary");
echo $filedata;
?>如果你想知道,下面是“assignment”表结构的截图:image
发布于 2015-01-15 17:45:49
$data=$_FILES‘’browsefile‘;
您将上载文件的临时名称分配给' data‘列,而不是数据本身。解决这个问题的捷径是使用file_get_contents函数。
第二: readfile从磁盘读取文件,它不提供来自变量的输出流。不需要这一行。
但是:不建议在数据库中保存二进制文件。最好将文件本身存储在一个上传文件夹中,并保存它的名称。
另外,更改下一行
mysql_query("INSERT INTO assignment (name, mime, size, data, created, uploader, subject, chapter) VALUES ('$name', '$mime', '$size', '$data', NOW(), '$nametemp', '$subjecttemp', '$chapter')");转到
mysql_query("INSERT INTO assignment (name, mime, size, data, created, uploader, subject, chapter) VALUES ('$name', '$mime', '$size', '" . mysql_real_escape_string($data) . "', NOW(), '$nametemp', '$subjecttemp', '$chapter')");接下来:请考虑更改为PDO,而不是使用旧的Mysql_*函数(它们已被弃用)。
https://stackoverflow.com/questions/27960478
复制相似问题