如果我上传一个大图片,比如20MB,它不会在Firefox中显示,但它在其他浏览器上运行没有任何问题,比如Chrome、Brave、Edge或Opera.对于较小的图像,例如5MB,图像将显示在Firefox上.

有没有办法解决这个问题,或者这是Firefox中的一个常见错误?

一种解决方案是使用URL.createObjectURL(file),但我需要图像内容,因为我还将图像发送到我的后端.

有没有一个解决方案可以在Firefox上使用FileReader()

或者,我将不得不通过URL.createObjectURL(file)显示图像,并通过FileReader()获得内容.

代码:

window.addEventListener("load", () => {
    document.getElementById("error").addEventListener("change", e => {

        const reader = new FileReader()

        reader.addEventListener("load", () => {
            document.getElementById("error_img").src = reader.result
        })
        reader.readAsDataURL(e.target.files[0])
    })

    document.getElementById("success").addEventListener("change", e => {
        document.getElementById("success_img").src = URL.createObjectURL(e.target.files[0])
    })
})
div {
    display: grid;
    grid-template:
        "a b"
        "c d";
}

img {
    display: block;
    object-fit: contain;
    width: 90%;
    height: 90%;
}
<div>
    <label>
        Error
        <input type="file" id="error">
    </label>

    <label>
        Works
        <input type="file" id="success">
    </label>

    <img src="" alt="" id="error_img">
    <img src="" alt="" id="success_img">
</div>

推荐答案

您可以将数据读取到ArrayBufferBlob中(发送到服务器),并从该数据创建对象URL以在img中使用.它只读取数据一次,但将其用于两件事.(您也可以只使用File两次,但我认为您可能试图避免两次读取数据.也就是说,我不认为两次读取数据会导致显著的延迟,浏览器甚至可能会缓存数据(我不知道是否会).

document.getElementById("error").addEventListener("change", (e) => {
    (async () => {
        try {
            // Read the data so we can send it to the server...
            const data = await e.target.files[0].arrayBuffer();
            const blob = new Blob([data]);
            // Create URL for image
            const url = URL.createObjectURL(blob);
            document.getElementById("error_img").src = url;

            // ...use `data` or `blob` to send to server...
        } catch (error) {
            // ...handle/report error...
        }
    })();
});

或者,如果您愿意:

document.getElementById("error").addEventListener("change", (e) => {
    // Read the data so we can send it to the server...
    e.target.files[0].arrayBuffer()
    .then((data) => {
        const blob = new Blob([data]);
        // Create URL for image
        const url = URL.createObjectURL(blob);
        document.getElementById("error_img").src = url;

        // ...use `data` or `blob` to send to server...
    })
    .catch((error) => {
        // ...handle/report error...
    });
});

window.addEventListener("load", () => {
    document.getElementById("error").addEventListener("change", (e) => {
        (async () => {
            try {
                const data = await e.target.files[0].arrayBuffer();
                // Create URL for image
                const url = URL.createObjectURL(new Blob([data]));
                document.getElementById("error_img").src = url;

                // ...use `data` to send to server...
            } catch (error) {
                // ...handle/report error...
            }
        })();
    });

    document.getElementById("success").addEventListener("change", (e) => {
        document.getElementById("success_img").src = URL.createObjectURL(e.target.files[0]);
    });
});
div {
    display: grid;
    grid-template:
        "a b"
        "c d";
}

img {
    display: block;
    object-fit: contain;
    width: 90%;
    height: 90%;
}
<div>
    <label>
        Error
        <input type="file" id="error">
    </label>

    <label>
        Works
        <input type="file" id="success">
    </label>

    <img src="" alt="" id="error_img">
    <img src="" alt="" id="success_img">
</div>

Javascript相关问答推荐

如何提取Cypress中文本

将数据从strapi提取到next.js,但响应延迟API URL

materialized - activeIndex返回-1

类型自定义lazy Promise. all

切换时排序对象数组,切换不起作用

在JS中拖放:检测文件

如何发送从REST Api收到的PNG数据响应

使用VUE和SCSS的数字滚动动画(&;内容生成)

根据一个条件,如何从处理过的数组中移除一项并将其移动到另一个数组?

如何用javascript更改元素的宽度和高度?

如何在一个对象Java脚本中获取不同键的重复值?

如何使用Astro优化大图像?

构建器模式与参数对象输入

P5JS-绘制不重叠的圆

如何在下一个js中更改每个标记APEXCHARTS图表的 colored颜色

正则表达式以确定给定文本是否不只包含邮箱字符串

如何设置时间选取器的起始值,仅当它获得焦点时?

当达到高度限制时,如何裁剪图像?使用html和css

Reaction-在同一页内滚动导航(下拉菜单)

如何在底部重叠多个div?