当用户粘贴一张图片时,如何在 React JS 中上传该图片

4
我正在使用 React JS 开发一个聊天应用程序,如果我在聊天框中复制粘贴图像,希望能上传该图像。如何触发这个操作呢?
我需要的是:
- 当执行“粘贴”动作时会触发一个事件。 - 一种从剪贴板上传图片到文件类型输入元素的方式。

1
我建议在谷歌上查找这两个要点。有很多资源可以帮助你。直接复制粘贴你的第一个要点,会返回一些关于如何处理该事件的示例。 - Cerbrus
1个回答

3
您需要在“粘贴”事件上添加一个事件侦听器,并从剪贴板中获取“items”,然后检查它的类型是否为图像。

<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>HTML DOM - Paste an image from the clipboard</title>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <link rel="stylesheet" href="/css/demo.css" />
        <link rel="preconnect" href="https://fonts.gstatic.com" />
        <link
            rel="stylesheet"
            href="https://fonts.googleapis.com/css2?family=Inter&family=Source+Code+Pro&display=swap"
        />
        <style>
            .container {
                /* Center the content */
                align-items: center;
                display: flex;
                justify-content: center;

                /* Misc */
                height: 32rem;
                padding: 1rem 0;
            }
            .key {
                background-color: #f7fafc;
                border: 1px solid #cbd5e0;
                border-radius: 0.25rem;
                padding: 0.25rem;
            }
            .preview {
                align-items: center;
                border: 1px solid #cbd5e0;
                display: flex;
                justify-content: center;

                margin-top: 1rem;
                max-height: 16rem;
                max-width: 42rem;
            }
        </style>
    </head>
    <body>
        <div class="container">
            <div>
                <div><kbd class="key">Ctrl</kbd> + <kbd class="key">V</kbd> in this window.</div>
                <img class="preview" id="preview" />
                <input id="file_input" type="file" />
            </div>
        </div>
       
        <script>
            document.addEventListener('DOMContentLoaded', function () {
                document.addEventListener('paste', function (evt) {
                    const clipboardItems = evt.clipboardData.items;
                    const items = [].slice.call(clipboardItems).filter(function (item) {
                        // Filter the image items only
                        return /^image\//.test(item.type);
                    });
                    if (items.length === 0) {
                        return;
                    }

                    const item = items[0];
                    const blob = item.getAsFile();

                    const imageEle = document.getElementById('preview');
                    imageEle.src = URL.createObjectURL(blob);
                    let file = new File([blob], "file name",{type:"image/jpeg", lastModified:new Date().getTime()}, 'utf-8');
                    let container = new DataTransfer(); 
                    container.items.add(file);
                    document.querySelector('#file_input').files = container.files;
                });
            });
        </script>
    </body>
</html>

资源

  1. 从剪贴板粘贴图片
  2. 使用Blob设置文件值

1
谢谢。我遇到了另一个问题,安卓设备上出现了错误。为了解决这个问题,请将item.type.indexOf("image") !== -1这一行改为/^image\//.test(item.type)。您可以在此处查看完整的问题:https://stackoverflow.com/questions/73813376/upload-image-when-user-pastes-an-image-through-mobile - Inaara Kalani
@InaaraKalani,感谢您的更新,我也会更新答案。 - Mina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接