环信创建群组html,10个HTML文件上传技巧

最近开源了一个 Vue 组件,还不够完善,欢迎大家来一起完善它,也希望大家能给个 star 支持一下,谢谢各位了。

简介

上传文件功能可以说是项目经常出现的需求。从在社交媒体上上传照片到在求职网站上发布简历,文件上传无处不在。在本文中,我们将讨论 HTML文件上传支持的10种用法,希望对你有用。

1. 单文件上传

我们可以将input 类型指定为file,以在Web应用程序中使用文件上传功能。

input filte 提供按钮上传一个或多个文件。 默认情况下,它使用操作系统的本机文件浏览器上传单个文件。成功上传后,File API 使得可以使用简单的 JS 代码读取File对象。 要读取File对象,我们需要监听 change事件。

首先,通过id获取文件上传的实例:const fileUploader = document.getElementById('file-uploader');

然后添加一个change 事件侦听器,以在上传完成后读取文件对象, 我们从event.target.files属性获取上传的文件信息:fileUploader.addEventListener('change', (event) => {

const files = event.target.files;  console.log('files', files);

});

在控制台中观察输出结果,这里关注一下FileList数组和File对象,该对象具有有关上传文件的所有元数据信息。

bVcIGar

如果大家看到这里,有点激动,想手贱一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen...点击预览

2. 多文件上传

如果我们想上传多个文件,需要在标签上添加 multiple 属性:

现在,我们可以上传多个文件了,以前面事例为基础,选择多个文件上传后,观察一下控制台的变化:

bVcIGaV

如果大家看到这里,有点激动,想手贱一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen...点击预览

3.了解文件元数据

每当我们上传文件时,File对象都有元数据信息,例如file name,size,last update time,type 等等。这些信息对于进一步的验证和特殊处理很有用。const fileUploader = document.getElementById('file-uploader');// 听更 change 件并读取元数据fileUploader.addEventListener('change', (event) => {  // 获取文件列表数组

const files = event.target.files;  // 遍历并获取元数据

for (const file of files) {    const name = file.name;    const type = file.type ? file.type: 'NA';    const size = file.size;    const lastModified = file.lastModified;

console.log({ file, name, type, size, lastModified });

}

});

下面是单个文件上传的输出结果:

bVcH6Ab

如果大家看到这里,有点激动,想手贱一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen...点击预览

4.了解 accept 属性

我们可以使用accept属性来限制要上载的文件的类型,如果只想上传的文件格式是 .jpg,.png 时,可以这么做:

在上面的代码中,只能选择后缀是.jpg和.png的文件。

如果大家看到这里,有点激动,想手贱一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen...点击预览

5. 管理文件内容

成功上传文件后显示文件内容,站在用户的角度上,如果上传之后,没有一个预览的,就很奇怪也不体贴。

我们可以使用FileReader对象将文件转换为二进制字符串。 然后添加load 事件侦听器,以在成功上传文件时获取二进制字符串。// FileReader 实例const reader = new FileReader();

fileUploader.addEventListener('change', (event) => {

const files = event.target.files;

const file = files[0];

reader.readAsDataURL(file);

reader.addEventListener('load', (event) => {

const img = document.createElement('img');

imageGrid.appendChild(img);

img.src = event.target.result;

img.alt = file.name;

});

});

如果大家看到这里,有点激动,想手贱一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen...点击预览

6.验证文件大小

如果用户上传图片过大,为了不让服务器有压力,我们需要限制图片的大小,下面是允许用户上传小于 1M 的图片,如果大于 1M 将上传失败。fileUploader.addEventListener('change', (event) => {  // Read the file size

const file = event.target.files[0];

const size = file.size;

let msg = ''; // 检查文件大小是否大于1MB

if (size > 1024 * 1024) {

msg = `The allowed file size is 1MB. The file you are trying to upload is of ${returnFileSize(size)}`;

} else {

msg = ` A ${returnFileSize(size)} file has been uploaded successfully. `;

}

feedback.innerHTML = msg;

});

如果大家看到这里,有点激动,想手贱一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen...点击预览

7. 显示文件上传进度

更好的用户体验是让用户知道文件上传进度,前面我们用过了FileReader以及读取和加载文件的事件。const reader = new FileReader();

FileReader还有一个progress 事件,表示当前上传进度,配合HTML5的progress标签,我们来模拟一下文件的上传进度。reader.addEventListener('progress', (event) => {  if (event.loaded && event.total) {    // 计算完成百分比

const percent = (event.loaded / event.total) * 100;    // 将值绑定到 `progress`标签

progress.value = percent;

}

});

bVcH6He

如果大家看到这里,有点激动,想手贱一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen...点击预览

8. 怎么上传目录上传?

我们可以上传整个目录吗?嗯,这是可能的,但有一些限制。有一个叫做webkitdirectory的非标准属性(目前只有谷歌浏览器还有Microsoft Edge支持按照文件夹进行上传),它允许我们上传整个目录。目前只有谷歌浏览器还有Microsoft Edge支持按照文件夹进行上传,具体可以看下百度云盘的网页版的上传按钮,在火狐下就支持按照文件进行上传,而在谷歌和Edge下,就会给用户提供一个下拉,让用户选择是根据文件进行上传还是根据文件夹进行上传。

用户必须需要确认才能上传目录

bVcH6Hm

用户单击“上传”按钮后,就会进行上传。 这里要注意的重要一点。 FileList数组将以平面结构的形式包含有关上载目录中所有文件的信息。 对于每个File对象,webkitRelativePath属性表示目录路径。

例如,上传一个主目录及其下的其他文件夹和文件:

bVcH6Hq

现在,File 对象将将webkitRelativePath填充为:

bVcH6Hp

如果大家看到这里,有点激动,想手贱一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen...点击预览

9. 拖拽上传

不支持文件上传的拖拽就有点 low 了,不是吗?我们来看看如何通过几个简单的步骤实现这一点。

首先,创建一个拖放区域和一个可选的区域来显示上传的文件内容。

Drag & Drop an Image

DROP HERE

Your image to appear here..

通过它们各自的ID获取dropzone和content 区域。const dropZone = document.getElementById('drop-zone'); const content = document.getElementById('content');

添加一个dragover 事件处理程序,以显示将要复制的内容的效果:dropZone.addEventListener('dragover', event => {  event.stopPropagation();  event.preventDefault();  event.dataTransfer.dropEffect = 'copy';

});

bVcH8GF

接下来,我们需要一个drop事件监听器来处理。dropZone.addEventListener('drop', event => {  // Get the files

const files = event.dataTransfer.files;

});

如果大家看到这里,有点激动,想手贱一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen...点击预览

10. 使用objectURL处理文件

有一个特殊的方法叫做URL.createobjecturl(),用于从文件中创建唯一的URL。还可以使用URL.revokeObjectURL()方法来释放它。URL.revokeObjectURL() 静态方法用来释放一个之前已经存在的、通过调用 URL.createObjectURL() 创建的 URL 对象。当你结束使用某个 URL 对象之后,应该通过调用这个方法来让浏览器知道不用在内存中继续保留对这个文件的引用了。fileUploader.addEventListener('change', (event) => {

const files = event.target.files;

const file = files[0];

const img = document.createElement('img');

imageGrid.appendChild(img);

img.src = URL.createObjectURL(file);

img.alt = file.name;

});

如果大家看到这里,有点激动,想手贱一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen...点击预览

总结

无论何时,如果你还想学习本文涉及的一些知识,你可以在这里尝试。

代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
创建 WebSocket 群组,需要在服务器端实现以下步骤: 1. 创建一个群组对象,用于存储群组成员的 WebSocket 连接。 2. 当一个客户端连接到服务器时,将其 WebSocket 连接对象添加到群组对象中。 3. 当需要向群组中的所有客户端发送消息时,遍历群组对象中的所有 WebSocket 连接对象,将消息发送给每个连接对象。 4. 当一个客户端断开连接时,从群组对象中移除其 WebSocket 连接对象。 下面是一个示例代码,用于创建 WebSocket 群组: ``` // 创建 WebSocket 服务器 const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); // 创建群组对象 const group = new Set(); // 监听连接事件 wss.on('connection', (ws) => { // 将连接对象添加到群组中 group.add(ws); // 监听消息事件 ws.on('message', (message) => { // 将消息发送给群组中的每个连接对象 group.forEach((client) => { if (client !== ws && client.readyState === WebSocket.OPEN) { client.send(message); } }); }); // 监听断开连接事件 ws.on('close', () => { // 从群组中移除连接对象 group.delete(ws); }); }); ``` 在上面的示例代码中,我们创建了一个 WebSocket 服务器,并创建了一个名为 `group` 的群组对象。当一个客户端连接到服务器时,我们将其 WebSocket 连接对象添加到 `group` 中。当需要向群组中的所有客户端发送消息时,我们遍历 `group` 中的所有 WebSocket 连接对象,将消息发送给每个连接对象。当一个客户端断开连接时,我们从 `group` 中移除其 WebSocket 连接对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值