前端不使用file类型input也能触发文件上传

本文介绍了如何使用JavaScript的showOpenFilePicker方法实现点击按钮选择图片文件,并展示所选图片。通过设置options参数,可以指定选择文件的类型和数量,例如选择多张本地桌面图片。同时,文章还提到了该方法的使用限制,如需要HTTPS环境及不能在iframe内使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

showOpenFilePicker方法

假设页面上有个按钮,其HTML如下所示:

<button id="button">选择图片</button>

则下面几行JavaScript代码就可以实现点击按钮出现文件选择:

button.addEventListener('click', function () {
    // 打开文件
    window.showOpenFilePicker();
});

当然,我们也可以使用 showDirectoryPicker() 方法来选择文件夹。

button.addEventListener('click', function () {
    // 打开文件夹
    window.showDirectoryPicker();
});

件类型、多选与否的指定
showOpenFilePicker(options) 方法中是可以传参的,具体支持的参数如下:

其中,options是可选参数,支持下面这些属性:

multiple
布尔值,默认值是 false ,表示只能选择一个文件。
excludeAcceptAllOption
布尔值,默认值是 false ,表示是否排除下面 types 中的所有的accept文件类型。
types
可选择的文件类型数组,每个数组项也是个对象,支持下面两个参数:
description:表示文件或者文件夹的描述,字符串,可选。
accept:接受的文件类型,对象,然后对象的键是文件的MIME匹配,值是数组,表示支持的文件后缀。具体可以下面的示意。
例如下面的JS代码执行就是可以一次性选择多张本地桌面图片:

window.showOpenFilePicker({
    types: [{
        description: 'Images',
        accept: {
            'image/*': ['.png', '.gif', '.jpeg', '.jpg', '.webp']
        }
    }],
    // 可以选择多个图片
    multiple: true
});

演示-点击按钮选择并显示多图*

完整代码如下:

<button id="button">选择图片</button>
<p id="output"></p>
button.addEventListener('click', async function () {
    // 打开文件
    const arrFileHandle = await window.showOpenFilePicker({
        types: [{
            accept: {`在这里插入代码片`
                'image/*': ['.png', '.gif', '.jpeg', '.jpg', '.webp']
            }
        }],
        // 可以选择多个图片
        multiple: true
    });
    
    // 遍历选择的文件
    for (const fileHandle of arrFileHandle) {
        // 获取文件内容
        const fileData = await fileHandle.getFile();
        // 读文件数据
        const buffer = await fileData.arrayBuffer();
        // 转成Blod url地址
        let src = URL.createObjectURL(new Blob([buffer]));
        // 在页面中显示
        output.insertAdjacentHTML('beforeend', `<img src="${src}">`);
    }
});

其他限制
需要https环境,如果是本地localhost 不受此限制。
不能在 iframe 内使用,因为被认为不安全
### HTML `input type='file'` 文件上传实现方法 #### 基本概念 HTML 中的 `<input>` 元素可以通过设置其 `type` 属性为 `'file'` 来创建一个文件选择控件。这个控件允许用户从本地设备中选择一个或多个文件并将其上传到服务器。当用户选择了文件后,可以利用 JavaScript 获取这些文件的相关信息并通过 AJAX 或表单提交的方式发送给服务器。 #### 使用说明 - **FileList 对象**:通过 `files` 属性获取所选文件列表,该属性返回的是一个只读的 FileList 对象[^1]。 - **name 属性**:定义输入字段的名称,在提交表单时用来标识数据[^4]。 - **隐藏样式与自定义触发器**:由于默认样式的局限性,通常会将原生的 `<input type="file">` 隐藏,并通过其他方式(如点击图片或其他按钮)间接触发表单操作[^2]。 #### 示例代码 以下是完整的前端实现示例: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>文件上传</title> <style> /* 隐藏原始文件上传按钮 */ #uploadButton { display: none; } .custom-file-upload { border: 1px solid #ccc; padding: 6px 12px; cursor: pointer; background-color: #f0f0f0; } </style> </head> <body> <h3>文件上传示例</h3> <!-- 自定义触发区域 --> <label for="uploadButton" class="custom-file-upload">选择文件</label> <input id="uploadButton" type="file" multiple /> <div id="output"></div> <script> document.getElementById('uploadButton').addEventListener('change', function(event) { const files = event.target.files; // 获取 FileList 对象 let output = ''; if (files.length === 0) { output += '<p>No selected files.</p>'; } else { Array.from(files).forEach(file => { // 遍历所有选定的文件 output += ` <p><strong>${escape(file.name)}</strong> (${formatBytes(file.size)}) - last modified: ${new Date(file.lastModified).toLocaleDateString()}</p> `; }); } document.getElementById('output').innerHTML = output; function formatBytes(bytes, decimals = 2) { if (!bytes) return '0 Bytes'; const k = 1024, dm = decimals || 2, sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'], i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; } }); </script> </body> </html> ``` 此代码展示了如何使用 CSS 和 JavaScript 创建更友好的用户体验界面以及展示已选文件的基本详情。 #### 进阶应用——大文件分片上传 对于较大的文件上传场景,推荐采用分片技术以提高效率和稳定性。具体流程包括但限于以下几个方面: - 初始化请求通知服务端即将开始传输; - 将文件分割成若干个小片段逐一传递至后台存储位置; - 跟踪每部分的成功状态直至完成全部内容传送; - 提供取消机制以便中断正在进行的任务; - 清理残留资源防止占用过多空间等问题发生[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值