上传和下载 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 脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何修改我的 PHP 和 HTML 代码以从 MySQL 下载文件

安全的 PHP 文件上传脚本

MIME 应用程序/下载

php上传文件到服务器

使用PHP脚本如何上传多个文件

百度网盘自动上传脚本-bpcs_uploader