您的位置:

input type="file" 文件上传的详细介绍

一、选取并上传文件

input type="file" 是用于选择本地文件并上传到服务器的功能。在实现过程中,需要注意以下几点:

1、input 标签的 name、id、accept 属性

  name 属性用于服务器接收传来的文件的参数名,id 属性用于 JS 操作 DOM,accept 属性可限制文件类型和大小。例如:

    <input type="file" name="file" id="file" accept=".jpg,.png" />

2、JS 获取上传的文件及其文件名

  通过 JS 获取 input 标签的 value,即文件路径,我们可以获得文件的文件名:

    let selectedFile = document.getElementById('file').files[0];
    console.log(selectedFile.name);

3、发送 POST 请求上传文件

  实现文件上传最常见的方法是使用表单提交,即 POST 方法。我们需要将文件转化为二进制数据进行传输,同时需要设置请求头和表单数据,代码如下:

    let xhr = new XMLHttpRequest();
    let formData = new FormData();
    formData.append('file', selectedFile, selectedFile.name);
    xhr.open('POST', 'upload.php', true);
    xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    xhr.send(formData);

二、文件上传进度条

为了提高用户体验,我们可以增加文件上传进度条。

1、监听事件 onprogress 和 onload

  通过监听事件 onprogress 和 onload,我们可以获得上传进度和上传完成的信息。其中,loaded 属性表示上传的字节数,total 属性表示文件的总字节数。

    xhr.upload.onprogress = function(event) {
        if (event.lengthComputable) {
            let percentComplete = Math.round((event.loaded / event.total) * 100);
            console.log(percentComplete + '% uploaded');
        }
    };
    xhr.onload = function() {
        console.log(xhr.responseText);
    };

2、实现进度条样式

  在 HTML 中,我们可以设置一个进度条样式:

    <div class="progress-bar"></div>

  在 CSS 中,我们可以设置进度条样式:

    .progress-bar {
        width: 0%;
        height: 20px;
        background-color: green;
    }

  在 JS 中,我们可以实现进度条的动画效果,代码如下:

    xhr.upload.onprogress = function(event) {
        if (event.lengthComputable) {
            let percentComplete = Math.round((event.loaded / event.total) * 100);
            console.log(percentComplete + '% uploaded');
            let progressBar = document.querySelector('.progress-bar');
            progressBar.style.width = percentComplete + '%';
        }
    };
    xhr.onload = function() {
        console.log(xhr.responseText);
        let progressBar = document.querySelector('.progress-bar');
        progressBar.style.width = '100%';
    };

三、后台接收文件并保存

1、服务器可以使用 PHP 来接收文件,PHP 提供了一个 $_FILES 全局变量,用于存储上传文件的信息。代码如下:

    $file = $_FILES['file'];
    move_uploaded_file($file['tmp_name'], 'uploads/'.$file['name']);
    echo 'success';

2、在 move_uploaded_file 函数中,第一个参数是源文件路径,第二个参数是目标文件路径。在目标文件路径中,可以指定文件的存储位置和文件名。

3、为了防止文件重名,可以在文件名中添加时间戳等随机数,如:

    $file = $_FILES['file'];
    $timestamp = time();
    move_uploaded_file($file['tmp_name'], 'uploads/'.$timestamp.'_'.$file['name']);
    echo 'success';

四、安全性考虑

1、客户端限制文件类型和大小

  通过设置 input 标签的 accept 属性,可以限制文件类型,通过设置 input 标签的 size 属性,可以限制文件大小。

2、解决文件上传漏洞

  文件上传漏洞是指攻击者通过上传恶意文件,在网站服务器上执行恶意代码。为了解决文件上传漏洞,可以采用以下方法:

  ①在服务端对上传的文件进行检查和限制,如限制上传文件类型和大小;

  ②在客户端对文件进行验证和过滤,如限制文件类型和大小;

  ③对上传文件的后缀名进行检查,如 js、php、html 等文件不能正常解析;

  ④对服务器上的上传文件进行隔离和限制权限,即避免上传文件可以访问或修改其他文件。

五、总结

以上是 input type="file" 文件上传的详细介绍。通过合理的限制和措施,我们可以使文件上传的功能更加安全、可靠、用户友好。