PHP Subida de archivos


Con PHP, puedes subir archivos al servidor.

Los ejemplos de este capítulo se realizan en el proyecto test, con la siguiente estructura de directorios:

test
|-----upload             # 文件上传的目录
|-----form.html          # 表单文件
|-----upload_file.php    # php 上传代码

Descargar código fuente


Crear un formulario de subida de archivos

Permitir a los usuarios subir archivos desde un formulario es muy útil.

Veamos el siguiente formulario HTML para subir archivos:

<html>
<head>
<meta charset="utf-8">
<title>Ejemplo(example.com)</title>
</head>
<body>

<form action="upload_file.php" method="post" enctype="multipart/form-data">
    <label for="file">文件名:</label>
    <input type="file" name="file" id="file"><br>
    <input type="submit" name="submit" value="提交">
</form>

</body>
</html>

Guarda el código anterior en un archivo llamado form.html.

A continuación se enumeran algunas notas sobre el formulario HTML anterior:

  • <form>de la etiquetaenctypeEl atributo especifica qué tipo de contenido se debe usar al enviar el formulario. Cuando el formulario necesita datos binarios, como contenido de archivos, use "multipart/form-data"。
  • <input>de la etiquetatype="file"El atributo especifica que la entrada debe tratarse como un archivo. Por ejemplo, al previsualizarlo en el navegador, verá un botón de examinar junto al campo de entrada.

Nota:Permitir a los usuarios subir archivos es un gran riesgo de seguridad. Solo permita que usuarios de confianza realicen operaciones de subida de archivos.


Crear el script de subida

El archivo "upload_file.php" contiene el código para subir archivos:

<?php
if ($_FILES["file"]["error"] > 0)
{
    echo "错误:" . $_FILES["file"]["error"] . "<br>";
}
else
{
    echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
    echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
    echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
}
?>

Usando el array global $_FILES de PHP, puede subir archivos desde la computadora del cliente al servidor remoto.

El primer parámetro es el nombre de entrada (input name) del formulario; el segundo índice puede ser "name", "type", "size", "tmp_name" o "error". Como se muestra a continuación:

  • $_FILES["file"]["name"] - El nombre del archivo subido
  • $_FILES["file"]["type"] - El tipo del archivo subido
  • $_FILES["file"]["size"] - El tamaño del archivo subido, en bytes
  • $_FILES["file"]["tmp_name"] - El nombre de la copia temporal del archivo almacenada en el servidor
  • $_FILES["file"]["error"] - El código de error causado por la subida del archivo

Esta es una forma muy sencilla de subir archivos. Por razones de seguridad, debe agregar restricciones sobre qué usuarios pueden subir archivos.


Límites de subida

En este script, hemos añadido restricciones a la subida de archivos. Los usuarios solo pueden subir archivos .gif, .jpeg, .jpg, .png, y el tamaño del archivo debe ser inferior a 200 kB:

<?php
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);        // 获取文件后缀名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800)    // 小于 200 kb
&& in_array($extension, $allowedExts))
{
    if ($_FILES["file"]["error"] > 0)
    {
        echo "错误:: " . $_FILES["file"]["error"] . "<br>";
    }
    else
    {
        echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
        echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
        echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
        echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
    }
}
else
{
    echo "非法的文件格式";
}
?>


Guardar el archivo subido

El ejemplo anterior crea una copia temporal del archivo subido en la carpeta temporal de PHP del servidor.

Esta copia temporal desaparece cuando el script termina. Para guardar el archivo subido, necesitamos copiarlo a otra ubicación:

<?php
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
echo $_FILES["file"]["size"];
$extension = end($temp);     // 获取文件后缀名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800)   // 小于 200 kb
&& in_array($extension, $allowedExts))
{
    if ($_FILES["file"]["error"] > 0)
    {
        echo "错误:: " . $_FILES["file"]["error"] . "<br>";
    }
    else
    {
        echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
        echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
        echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
        echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
        
        // 判断当前目录下的 upload 目录是否存在该文件
        // 如果没有 upload 目录,你需要创建它,upload 目录权限为 777
        if (file_exists("upload/" . $_FILES["file"]["name"]))
        {
            echo $_FILES["file"]["name"] . " 文件已经存在。 ";
        }
        else
        {
            // 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
            move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
            echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];
        }
    }
}
else
{
    echo "非法的文件格式";
}
?>

El script anterior comprueba si el archivo ya existe; si no existe, lo copia al directorio llamado "upload".

La demostración de la operación de subida de archivos se muestra a continuación:

Otras extensiones