上传和下载 PHP MySQL 脚本
Posted
技术标签:
【中文标题】上传和下载 PHP MySQL 脚本【英文标题】:Upload and Download Php MySQL Script 【发布时间】:2014-03-23 19:06:55 【问题描述】:我使用了一个在线提供的脚本。 File upload.php 允许用户上传文件,然后将选定的文件存储在 mysql 数据库中。稍后,download.php 脚本显示存储在数据库中的所有文件的链接。当用户单击链接时,应该下载文件。我已经附上了下面的脚本。但问题是,当我点击链接时,文件的内容会显示而不是下载。
上传.php
<!--
CREATE TABLE IF NOT EXISTS `upload` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
`type` varchar(30) NOT NULL,
`size` int(11) NOT NULL,
`content` longblob NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
-->
<html>
<head></head>
<body>
<form method="post" enctype="multipart/form-data">
<table border="0" cellpadding="1"
cellspacing="1" class="box">
<tr>
<td>please select a file</td></tr>
<tr>
<td>
<input type="hidden" name="MAX_FILE_SIZE"
value="16000000">
<input name="userfile" type="file" id="userfile">
</td>
<td ><input name="upload"
type="submit" class="box" id="upload" value=" Upload "></td>
</tr>
</table>
</form>
</body>
</html>
<?php
if (isset($_POST['upload']) && $_FILES['userfile']['size'] > 0)
$fileName = $_FILES['userfile']['name'];
$tmpName = $_FILES['userfile']['tmp_name'];
$fileSize = $_FILES['userfile']['size'];
$fileType = $_FILES['userfile']['type'];
$fileType = (get_magic_quotes_gpc() == 0 ? mysql_real_escape_string(
$_FILES['userfile']['type']) : mysql_real_escape_string(
stripslashes($_FILES['userfile'])));
$fp = fopen($tmpName, 'r');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content);
fclose($fp);
if (!get_magic_quotes_gpc())
$fileName = addslashes($fileName);
$con = mysql_connect('localhost', 'root', 'root') or die(mysql_error());
$db = mysql_select_db('test', $con);
if ($db)
$query = "INSERT INTO upload (name, size, type, content ) " .
"VALUES ('$fileName', '$fileSize', '$fileType', '$content')";
mysql_query($query) or die('Error, query failed');
mysql_close();
echo "<br>File $fileName uploaded<br>";
else
echo "file upload failed";
?>
下载.php
<html>
<head>
<title>Download File From MySQL Database</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1">
</head>
<body>
<?php
$con = mysql_connect('localhost', 'root', 'root') or die(mysql_error());
$db = mysql_select_db('test', $con);
$query = "SELECT id, name FROM upload";
$result = mysql_query($query) or die('Error, query failed');
if (mysql_num_rows($result) == 0)
echo "Database is empty <br>";
else
while (list($id, $name) = mysql_fetch_array($result))
?>
<a href="download.php?id=<?php echo urlencode($id); ?>"
><?php echo urlencode($name); ?></a> <br>
<?php
mysql_close();
?>
</body>
</html>
<?php
if (isset($_GET['id']))
$con = mysql_connect('localhost', 'root', 'root') or die(mysql_error());
$db = mysql_select_db('test', $con);
$id = $_GET['id'];
$query = "SELECT name, type, size, content " .
"FROM upload WHERE id = '$id'";
$result = mysql_query($query) or die('Error, query failed');
list($name, $type, $size, $content) = mysql_fetch_array($result);
header("Content-length: $size");
header("Content-type: $type");
header("Content-Disposition: attachment; filename=$name");
ob_clean();
flush();
echo $content;
mysql_close();
exit;
?>
【问题讨论】:
尝试添加header('Content-Transfer-Encoding: binary');
header('Content-Description: File Transfer');
和 readfile($file);
作为示例。也许只需添加readfile($file);
就足够了。同样$file
是一个示例变量。然而,它很可能与您的标题有关。
而不是header("Content-length: $size");
尝试header('Content-Length: ' . filesize($size));
@Fred-ii- 你的建议都没有任何意义。没有文件,数据在数据库中。 filesize
的参数是一个文件名,$size
是一个数字。
"当用户点击链接时,文件应该被下载。我已经附上了下面的脚本。但问题是,当我点击链接时,文件的内容会显示出来而不是下载。” @Barmar 和我没有想到 $size
,这是 OP 的变量。
@Fred-ii- 但是filesize($size)
是什么意思? $size
是大小,而不是文件名。
【参考方案1】:
download.php
在顶部显示所有 HTML,即使用户选择了要下载的文件。您需要将整个部分放在 if
中,这样它就不会放在下载开始时:
if (!isset($_GET['id']) ?>
<html>
...
</html>
<?php else
$con = mysql_connect('localhost', 'root', 'root') or die(mysql_error());
... // rest of script
【讨论】:
我肯定会为此 +1。我想我确实误解了这个问题。好戏巴尔玛。以上是关于上传和下载 PHP MySQL 脚本的主要内容,如果未能解决你的问题,请参考以下文章