上面的代码片段呈现了一个矩形容器,我们可以在其中粘贴文件。该容器有一个名为 contenteditable 的属性,设置为 true。 contenteditable 属性对于启用容器中的文件或任何其他项目的粘贴非常重要。如果 contenteditable 属性更改为 false 或删除,粘贴操作将无法按预期工作。我们还有一个ID为preview的容器。我们将使用预览容器来预览用户粘贴的图像。

让我们从 style.css 添加一些基本样式到我们的标记中

*{    font-family: Arial, Helvetica, sans-serif;}body{    text-align: center;    margin-block-start: 4rem;}#pasteArea {    border: 2px dashed #ccc;    padding: 20px;    width: 300px;    height: 200px;    display: flex;    align-items: center;    justify-content: center;    text-align: center;    cursor: pointer;    margin: auto;    color: rgb(5, 89, 89);}#preview img {    max-width: 100%;    margin-top: 10px;}

上面的标记和样式表创建了一个简单的破折号边框容器,其中包含简单的提示文本,如下面的屏幕截图所示:

\\\"Implementing

现在我们已经创建了 UI,让我们在下一节中使用 JavaScript 添加一些有用的功能。

剧本

在本节中,我们将使用 JavaScript 将粘贴事件侦听器添加到粘贴区域。在从 DOM 获取粘贴区域以附加事件侦听器之前,我们首先等待 DOM 内容加载,如下面的代码片段所示。

document.addEventListener(\\'DOMContentLoaded\\', () => {    const pasteArea = document.querySelector(\\'#pasteArea\\');    pasteArea.addEventListener(\\'paste\\', (event) => {    });});

在上面的代码片段中,我们添加了 DOMContentLoaded 事件的监听器。这使得我们可以等待 DOM 树创建后才能获取 DOM 元素。接下来,我们选择粘贴区域容器并向其附加粘贴事件侦听器。

从粘贴的项目中获取文件

粘贴事件处理程序在前面的代码片段中未实现。让我们通过从事件对象获取数据并将它们记录在控制台中来实现它。我们将在本文后面对数据进行更多处理,目前,我们只想确保在将项目粘贴到粘贴区域时接收到文件。下面的代码片段显示了粘贴事件处理程序的最小实现。

pasteArea.addEventListener(\\'paste\\', (event) => {        const items = event.clipboardData.items        for (const item of items) {            if (item.kind === \\'file\\') {                const file = item.getAsFile()                console.log(file)            }        }    })

在上面的代码片段中,我们从 event.clipboardData 对象获取项目。 event.clipboardData.items 是一个 DataTransferItemList,它是一个包含粘贴项目内容的类似列表的对象。这些项目存储在列表中,因为用户可以一次复制和粘贴多个项目。

接下来,我们使用 for ...of 循环迭代项目。在循环中,我们检查每个项目是否是一个文件。如果该项目是国王“文件”,我们将其作为文件获取并将其打印在浏览器的控制台上。

在控制台上打印文件信息对于网页的用户来说并不是很有用。让我们在下一节中做一些更有趣的事情。

预览上传的文件

如果我们不在任何地方显示它,那么在将项目粘贴到剪贴板后,用户将很难知道文件上传是否成功。通过显示指示成功的内容来表明文件已成功上传非常重要。还有什么比显示上传文件本身更好的指示上传成功的方法呢?

在本节中,我们将扩展粘贴事件处理程序以从接收到的文件创建 URL。文件加载到浏览器后,我们将使用创建的 URL 来呈现该文件。我们将利用 FileReader API 从文件创建 URL,如下面代码段中的代码所示。

pasteArea.addEventListener(\\'paste\\', (event) => {        const items = event.clipboardData.items        for (const item of items) {            if (item.kind === \\'file\\') {                const file = item.getAsFile()                const reader = new FileReader();                reader.onloadend = (e) => {                    const url = e.target.result                    console.log(url)                };                reader.readAsDataURL(file);            }        }    });

在上面的代码片段中,我们创建了 FileReader 的实例并使用它来生成数据 URL。我们还向 FileReader 对象附加了一个 loadend 事件侦听器,我们将读取结果记录到控制台。这是预览文件的第一步,我们现在可以使用 URL 来显示文件。

假设用户粘贴了图像文件,以下代码片段显示了我们如何扩展事件处理程序以创建 URL 并显示图像文件。

 reader.onloadend = (e) => {       const url = e.target.result       const preview = document.querySelector(\\'#preview\\')       const img = document.createElement(\\'img\\');       img.src = url;       preview.appendChild(img);   };

在上面的代码片段中,我们从 DOM 获取预览容器并创建一个 img 元素来渲染图像。我们将创建的 URL 指定为图像的 src,并将图像附加到预览容器中。将图像附加到预览容器后,用户现在可以知道他们粘贴的图像已成功加载到网页中。

成功!我们已经成功地在网页上实现了通过复制粘贴的方式上传文件。这种文件上传方式使用户能够轻松上传文件,无需点击几个按钮来选择要上传的文件。 ClipboadEvent 接口提供了一种从浏览器上粘贴的项目收集数据的简单方法。 FileReader 接口允许我们从上传的文件创建 URL 并使用它来预览上传的文件。

欢迎在评论区畅所欲言。从 MDN 查找有关 ClipBoardEvent 和 FileReader 接口的更多信息。

","image":"http://www.luping.net","datePublished":"2024-07-30T20:54:02+08:00","dateModified":"2024-07-30T20:54:02+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 在Web上实现文件复制粘贴输入

在Web上实现文件复制粘贴输入

发布于2024-07-30
浏览:897

在Web开发领域,收集用户输入时上传文件的方式有多种。其中一种方法是复制粘贴。文件输入的复制粘贴是一种非常直观的用户上传文件的方法。复制粘贴文件输入方法使用户无需记住要上传的文件的位置。在本文中,我们将讨论如何在您的网站上实现通过复制粘贴的方式输入文件。

我们将利用 ClipboadEvent 和 EventTarget 接口来实现复制粘贴文件输入。 ClipboardEvent接口提供了有关粘贴事件的信息,EventTarget接口允许我们监听粘贴事件。

在侦听粘贴事件时,我们将附加一个事件处理函数,在其中决定如何处理粘贴的项目。在我们的例子中,我们将获取粘贴的文件并在其完全加载到浏览器中后立即渲染它。我们将从 HTML 和样式开始。

HTML 和样式

让我们首先创建粘贴区域的 HTML 标记。下面的代码片段是 HTML 标记:



    
    
    Copy-Paste File Input
    


    
Paste your file here

上面的代码片段呈现了一个矩形容器,我们可以在其中粘贴文件。该容器有一个名为 contenteditable 的属性,设置为 true。 contenteditable 属性对于启用容器中的文件或任何其他项目的粘贴非常重要。如果 contenteditable 属性更改为 false 或删除,粘贴操作将无法按预期工作。我们还有一个ID为preview的容器。我们将使用预览容器来预览用户粘贴的图像。

让我们从 style.css 添加一些基本样式到我们的标记中

*{
    font-family: Arial, Helvetica, sans-serif;
}

body{
    text-align: center;
    margin-block-start: 4rem;
}
#pasteArea {
    border: 2px dashed #ccc;
    padding: 20px;
    width: 300px;
    height: 200px;
    display: flex;
    align-items: center;
    justify-content: center;
    text-align: center;
    cursor: pointer;
    margin: auto;
    color: rgb(5, 89, 89);
}

#preview img {
    max-width: 100%;
    margin-top: 10px;
}

上面的标记和样式表创建了一个简单的破折号边框容器,其中包含简单的提示文本,如下面的屏幕截图所示:

Implementing File Input By Copy-Paste on the Web

现在我们已经创建了 UI,让我们在下一节中使用 JavaScript 添加一些有用的功能。

剧本

在本节中,我们将使用 JavaScript 将粘贴事件侦听器添加到粘贴区域。在从 DOM 获取粘贴区域以附加事件侦听器之前,我们首先等待 DOM 内容加载,如下面的代码片段所示。

document.addEventListener('DOMContentLoaded', () => {
    const pasteArea = document.querySelector('#pasteArea');

    pasteArea.addEventListener('paste', (event) => {

    });
});

在上面的代码片段中,我们添加了 DOMContentLoaded 事件的监听器。这使得我们可以等待 DOM 树创建后才能获取 DOM 元素。接下来,我们选择粘贴区域容器并向其附加粘贴事件侦听器。

从粘贴的项目中获取文件

粘贴事件处理程序在前面的代码片段中未实现。让我们通过从事件对象获取数据并将它们记录在控制台中来实现它。我们将在本文后面对数据进行更多处理,目前,我们只想确保在将项目粘贴到粘贴区域时接收到文件。下面的代码片段显示了粘贴事件处理程序的最小实现。

pasteArea.addEventListener('paste', (event) => {
        const items = event.clipboardData.items
        for (const item of items) {
            if (item.kind === 'file') {
                const file = item.getAsFile()

                console.log(file)
            }
        }
    })

在上面的代码片段中,我们从 event.clipboardData 对象获取项目。 event.clipboardData.items 是一个 DataTransferItemList,它是一个包含粘贴项目内容的类似列表的对象。这些项目存储在列表中,因为用户可以一次复制和粘贴多个项目。

接下来,我们使用 for ...of 循环迭代项目。在循环中,我们检查每个项目是否是一个文件。如果该项目是国王“文件”,我们将其作为文件获取并将其打印在浏览器的控制台上。

在控制台上打印文件信息对于网页的用户来说并不是很有用。让我们在下一节中做一些更有趣的事情。

预览上传的文件

如果我们不在任何地方显示它,那么在将项目粘贴到剪贴板后,用户将很难知道文件上传是否成功。通过显示指示成功的内容来表明文件已成功上传非常重要。还有什么比显示上传文件本身更好的指示上传成功的方法呢?

在本节中,我们将扩展粘贴事件处理程序以从接收到的文件创建 URL。文件加载到浏览器后,我们将使用创建的 URL 来呈现该文件。我们将利用 FileReader API 从文件创建 URL,如下面代码段中的代码所示。

pasteArea.addEventListener('paste', (event) => {
        const items = event.clipboardData.items
        for (const item of items) {
            if (item.kind === 'file') {
                const file = item.getAsFile()


                const reader = new FileReader();

                reader.onloadend = (e) => {
                    const url = e.target.result
                    console.log(url)

                };
                reader.readAsDataURL(file);
            }
        }
    });

在上面的代码片段中,我们创建了 FileReader 的实例并使用它来生成数据 URL。我们还向 FileReader 对象附加了一个 loadend 事件侦听器,我们将读取结果记录到控制台。这是预览文件的第一步,我们现在可以使用 URL 来显示文件。

假设用户粘贴了图像文件,以下代码片段显示了我们如何扩展事件处理程序以创建 URL 并显示图像文件。

 reader.onloadend = (e) => {
       const url = e.target.result
       const preview = document.querySelector('#preview')
       const img = document.createElement('img');

       img.src = url;
       preview.appendChild(img);
   };

在上面的代码片段中,我们从 DOM 获取预览容器并创建一个 img 元素来渲染图像。我们将创建的 URL 指定为图像的 src,并将图像附加到预览容器中。将图像附加到预览容器后,用户现在可以知道他们粘贴的图像已成功加载到网页中。

成功!我们已经成功地在网页上实现了通过复制粘贴的方式上传文件。这种文件上传方式使用户能够轻松上传文件,无需点击几个按钮来选择要上传的文件。 ClipboadEvent 接口提供了一种从浏览器上粘贴的项目收集数据的简单方法。 FileReader 接口允许我们从上传的文件创建 URL 并使用它来预览上传的文件。

欢迎在评论区畅所欲言。从 MDN 查找有关 ClipBoardEvent 和 FileReader 接口的更多信息。

版本声明 本文转载于:https://dev.to/ghostaram/implementing-file-input-by-copy-paste-on-the-web-npb?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-04-01
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-04-01
  • 哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    编程 发布于2025-04-01
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。$("#map").css({ marginT...
    编程 发布于2025-04-01
  • 在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    For Each Loop vs. Iterator: Efficiency in Collection TraversalIntroductionWhen traversing a collection in Java, the choice arises between using a for-...
    编程 发布于2025-04-01
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-04-01
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-04-01
  • 如何简化PHP中的JSON解析以获取多维阵列?
    如何简化PHP中的JSON解析以获取多维阵列?
    php 试图在PHP中解析JSON数据的JSON可能具有挑战性,尤其是在处理多维数组时。要简化过程,建议将JSON作为数组而不是对象解析。执行此操作,将JSON_DECODE函数与第二个参数设置为true:[&&&&& && &&&&& json = JSON = JSON_DECODE($ j...
    编程 发布于2025-04-01
  • 在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在JTable中维护jtable单元格渲染后,在JTable中,在JTable中实现自定义单元格渲染和编辑功能可以增强用户体验。但是,至关重要的是要确保即使在编辑操作后也保留所需的格式。在设置用于格式化“价格”列的“价格”列,用户遇到的数字格式丢失的“价格”列的“价格”之后,问题在设置自定义单元格...
    编程 发布于2025-04-01
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-04-01
  • 为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    使用php dateTime修改月份:发现预期的行为在使用PHP的DateTime类时,添加或减去几个月可能并不总是会产生预期的结果。正如文档所警告的那样,“当心”这些操作的“不像看起来那样直观。 考虑文档中给出的示例:这是内部发生的事情: 现在在3月3日添加另一个月,因为2月在2001年只有2...
    编程 发布于2025-04-01
  • 如何使用node-mysql在单个查询中执行多个SQL语句?
    如何使用node-mysql在单个查询中执行多个SQL语句?
    Multi-Statement Query Support in Node-MySQLIn Node.js, the question arises when executing multiple SQL statements in a single query using the node-mys...
    编程 发布于2025-04-01
  • 如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    postgresql:为每个唯一标识符提取最后一行,在Postgresql中,您可能需要遇到与在数据库中的每个不同标识相关的信息中提取信息的情况。考虑以下数据:[ 1 2014-02-01 kjkj 在数据集中的每个唯一ID中检索最后一行的信息,您可以在操作员上使用Postgres的有效效率: ...
    编程 发布于2025-04-01
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-04-01
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-04-01

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3