You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Firebase Storage模拟器时图片无法正确上传问题排查

问题排查与修复方案

核心错误:上传对象错误

你在调用uploadBytesResumable时,传入的参数是DOM元素file,而非选中的文件对象selectedFile。file作为DOM元素被转换为字符串后长度极小,这就是为什么你得到9B的损坏文件。
修复:将上传代码中的file替换为selectedFile:

var uploadTask = uploadBytesResumable(storageRef, selectedFile, metadata);

条件判断逻辑问题

if (user, selectedFile)使用了逗号运算符,实际只会校验selectedFile是否存在,忽略了用户登录状态的判断。应该改为逻辑与校验,确保用户已登录且有选中文件才执行上传:

if (user && selectedFile) {

可选优化:避免硬编码文件类型

代码中强制设置contentType: 'image/png',如果用户上传JPG等其他格式图片,会导致文件类型不匹配。建议使用文件本身的MIME类型:

const metadata = {
    contentType: selectedFile.type
};

可选优化:复用已获取的用户对象

已经通过onAuthStateChanged拿到了user变量,无需再调用auth.currentUser,直接使用user.uid即可,避免潜在的空值风险:

var storageRef = ref(storage, `users/${user.uid}/profileImage.png`);

修复后的完整代码

file.addEventListener('change', (e) => {
    const selectedFile = e.target.files[0];
    onAuthStateChanged(auth, (user) => {
        if (user && selectedFile) {
            const reader = new FileReader();

            reader.addEventListener('load', function () {
                img.setAttribute('src', reader.result);
            });

            reader.readAsDataURL(selectedFile);

            const metadata = {
                contentType: selectedFile.type
            };

            var storageRef = ref(storage, `users/${user.uid}/profileImage.png`);

            var uploadTask = uploadBytesResumable(storageRef, selectedFile, metadata);

            uploadTask.on(
                'state_changed',
                (snapshot) => {
                    const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
                    progressBar.style.width = `${progress}%`;
                    console.log('Upload is ' + progress + '% done');
                    switch (snapshot.state) {
                        case 'paused':
                            console.log('Upload is paused');
                            break;
                        case 'running':
                            console.log('Upload is running');
                            break;
                    }
                }, (error) => {
                    switch (error.code) {
                        case 'storage/unauthorized':
                            alert('User has no permission');
                            break;
                        case 'storage/canceled':
                            alert('Upload was cancelled');
                            break;
                        case 'storage/unknown':
                            alert(error);
                            break;
                    }
                }, () => {
                    getDownloadURL(uploadTask.snapshot.ref).then((downloadURL) => {
                        console.log('File available at', downloadURL);
                        img.src = downloadURL;
                        updateProfile(user, { photoURL: downloadURL })
                            .then(() => console.log(user))
                            .catch((error) => console.log(error));
                    });
                    document.getElementById('submit_link').removeAttribute('disabled');
                });
        } else {
            console.log(`user doc could not be updated`);
        };
    });
});

内容的提问来源于stack exchange,提问作者HarryNC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:05:33