我能够将文件上传到mysql但是当我下载它时,内容会发生变化..例如我有test.txt和
“你好”
on ..当我下载它时,test.txt变为
< pre class ='xdebug-var-dump'dir ='ltr'> string'sfasfsafasfsaf'(length = 14) sfasfsafasfsaf
不确定,出了什么问题......
这是我下载文件的代码:
<?php include("class_lib.php");
$db = new database();
$db->connect();
if(isset($_GET["file_id"])){
$file_id = $_GET["file_id"];
$query = "SELECT filename, filetype, filesize, bin_data " .
"FROM file_tbl WHERE id = '$file_id'";
$result = mysql_query($query) or die('Error, query failed' . mysql_error());
list($filename, $filetype, $filesize, $bin_data) = mysql_fetch_array($result);
var_dump($bin_data);
header("Content-length: $filesize");
header("Content-type: $filetype");
header("Content-Disposition: attachment; filename=$filename");
echo $bin_data;
}
?>
对于图像也是如此,它下载但是没有图像..它只显示"no preview available"
..这是我上面的下载脚本吗?
或者这个上传脚本我有:
$fileid = (string) ($lastemp_id + 1);
$fileName = basename($_FILES['binFile']['name']);
$extension = pathinfo($fileName, PATHINFO_EXTENSION);
$fileName .= "_fileid_" . $fileid;
$fileName = $fileName.".".$extension;
$tmpName = $_FILES['binFile']['tmp_name'];
$fileSize = $_FILES['binFile']['size'];
$fileType = $_FILES['binFile']['type'];
$fileDesc = $_POST["txtDescription"];
$fp = fopen($tmpName, 'r');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content);
fclose($fp);
if(!get_magic_quotes_gpc()){ $fileName = addslashes($fileName); }
if (isset($fileName)) {
$sql = "INSERT INTO file_tbl ";
$sql .= "(file_desc, bin_data, filename, filesize, filetype) ";
$sql .= "VALUES ('$fileDesc', '$content', ";
$sql .= "'$fileName', '$fileSize', '$fileType')";
mysql_query($sql, $db->connection) or die('Error: query failed' . mysql_error());
$message = "File uploaded.<br>"; var_dump($content);
}
else $message = "No file uploaded. (opt)";
这里究竟出了什么问题?
答案 0 :(得分:1)
你不顾一切地将二进制数据干扰到你的数据库中,甚至没有proper SQL escaping的气味。你期望发生什么?这个简短的代码示例充满了严重 SQL注入错误,我希望它不会在公共互联网上部署。
为了您自己的安全,您应立即停止使用蹩脚,旧的,已弃用的mysql_query
界面,并花费少量时间将查询切换为PDO。
如果使用占位符,则不会出现这样的问题。
在您输出正确的内容之前,您所看到的可能是虚假var_dump
声明的结果。
答案 1 :(得分:1)
如果上传文件完美无缺,请尝试此操作。 您可以在插入数据库时将二进制数据编码为64格式,并在下载之前进行解码。
<?php
ob_start();
include("class_lib.php");
$db = new database();
$db->connect();
if(isset($_GET["file_id"])){
$file_id = $_GET["file_id"];
$query = "SELECT filename, filetype, filesize, bin_data " .
"FROM file_tbl WHERE id = '$file_id'";
$result = mysql_query($query) or die('Error, query failed' . mysql_error());
list($filename, $filetype, $filesize, $bin_data) = mysql_fetch_array($result);
var_dump($bin_data);
ob_end_clean();
header("Content-length: $filesize");
header("Content-type: $filetype");
header("Content-Disposition: attachment; filename=$filename");
echo $bin_data;
exit;
}
&GT;