欢迎访问宙启技术站
智能推送

情境模拟:运用PHP函数实现文件上传和下载的项目实战讲解

发布时间:2023-06-03 11:30:50

在web应用程序开发中,文件的上传和下载功能是非常常见的需求。如何实现这些功能是每个web开发人员必须掌握的知识。本文将通过一个项目实战来讲解如何利用PHP函数来实现文件上传和下载功能。

项目实战需求描述

我们要实现的是一个简单的文件上传和下载功能,具体需求如下:

1.用户可以上传文件到服务器,上传的文件类型只能是图像文件(jpg、png、gif)或文本文件(txt、doc、docx、pdf);

2.用户上传的文件将保存在服务器上,并生成一个 的文件名,保存在数据库中;

3.用户可以浏览已经上传的文件列表;

4.用户可以点击下载按钮下载文件。

实现思路

根据以上需求,我们可以得出以下实现思路:

1.实现文件上传功能;

2.根据上传的文件生成 的文件名,保存在数据库中;

3.实现文件下载功能。

实现过程

1.实现文件上传功能

PHP提供了一个函数move_uploaded_file()来实现文件上传功能。move_uploaded_file()函数的使用方法如下:

move_uploaded_file(uploaded_file, destination_file);

其中:

uploaded_file:上传文件的临时存储路径,例如$_FILES['file']['tmp_name'];

destination_file:文件将要存储的路径和名字,例如'./uploads/filename.ext'。

首先我们需要通过表单获取上传的文件,表单代码如下:

<form action="upload.php" method="post" enctype="multipart/form-data">

    <input type="file" name="file" />

    <input type="submit" name="submit" value="上传" />

</form>

在表单中,我们通过enctype="multipart/form-data"来指定表单数据类型为文件类型。在提交表单时,我们需要对表单数据进行验证。对于上传文件的验证,我们需要检查上传文件的类型和大小是否符合要求。代码如下:

if ($_FILES['file']['error'] > 0) {

    echo '<p>文件上传失败,请稍后再试。</p>';

} else {

    $allowedExts = array('jpg', 'png', 'gif', 'txt', 'doc', 'docx', 'pdf');

    $temp = explode('.', $_FILES['file']['name']);

    $extension = end($temp);

    if ((($_FILES['file']['type'] == 'image/jpeg')

        || ($_FILES['file']['type'] == 'image/png')

        || ($_FILES['file']['type'] == 'image/gif')

        || ($_FILES['file']['type'] == 'text/plain')

        || ($_FILES['file']['type'] == 'application/msword')

        || ($_FILES['file']['type'] == 'application/vnd.openxmlformats-officedocument.wordprocessingml.document')

        || ($_FILES['file']['type'] == 'application/pdf'))

        && in_array($extension, $allowedExts)) {

        if ($_FILES['file']['size'] < 1024 * 1024) { // 限制上传文件的最大大小为1MB

            if (file_exists('upload/' . $_FILES['file']['name'])) {

                echo '<p>' . $_FILES['file']['name'] . '文件已经存在,请勿重复上传。</p>';

            } else {

                move_uploaded_file($_FILES['file']['tmp_name'], 'upload/' . $_FILES['file']['name']);

                echo '<p>' . $_FILES['file']['name'] . '文件上传成功。</p>';

            }

        } else {

            echo '<p>上传文件的大小不能超过1MB。</p>';

        }

    } else {

        echo '<p>上传文件的类型不符合要求。</p>';

    }

}

接下来,我们需要在服务器上保存上传的文件,并生成一个 的文件名。我们可以使用PHP函数uniqid()生成一个 的文件名。代码如下:

$file_name = uniqid() . '.' . $extension;

move_uploaded_file($_FILES['file']['tmp_name'], 'upload/' . $file_name);

2.生成 的文件名,保存在数据库中

上传的文件已经保存在服务器上,我们需要把这个文件名保存到数据库中。我们可以使用PHP函数mysqli_query()来执行INSERT语句。代码如下:

$conn = mysqli_connect($servername, $username, $password, $dbname);

if (!$conn) {

    die('连接失败:' . mysqli_connect_error());

}

$sql = "INSERT INTO files (file_name) VALUES ('$file_name')";

if (mysqli_query($conn, $sql)) {

    echo '<p>文件信息保存成功。</p>';

} else {

    echo '<p>文件信息保存失败,请稍后再试。</p>';

}

mysqli_close($conn);

3.实现文件下载功能

文件下载功能很简单,我们只需要在页面上展示所有上传的文件,并给每个文件加上下载链接。代码如下:

$conn = mysqli_connect($servername, $username, $password, $dbname);

if (!$conn) {

    die('连接失败:' . mysqli_connect_error());

}

$sql = "SELECT * FROM files";

$result = mysqli_query($conn, $sql);

if (mysqli_num_rows($result) > 0) {

    while ($row = mysqli_fetch_assoc($result)) {

        echo '<p>' . $row['file_name'] . ' <a href="download.php?file=' . $row['file_name'] . '">下载</a></p>';

    }

} else {

    echo '<p>还没有上传文件。</p>';

}

mysqli_close($conn);

在下载链接中,我们需要传递要下载的文件名给download.php文件。代码如下:

$file = $_GET['file'];

$ext = end(explode('.', $file));

header('Content-type: application/' . $ext);

header('Content-Disposition: attachment; filename="' . $file . '"');

readfile('upload/' . $file);

在download.php文件中,我们需要设置Content-type和Content-Disposition头文件,根据文件的后缀名来确定Content-type类型,然后使用readfile()函数来输出文件内容。

项目实战结束

以上就是通过一个项目实战来讲解如何利用PHP函数来实现文件上传和下载功能。希望本文能帮助到大家。