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

Blazor应用在三星折叠屏Android设备上图片上传失败排查

排查Blazor应用三星折叠屏图片上传NotReadableError问题

核心问题定位

报错NotReadableError本质是浏览器端无法读取选中的文件流,通常和文件权限、文件引用生命周期、折叠屏设备的特殊文件处理逻辑有关。结合你的代码与场景,从以下方向逐步排查:

1. 提前缓存文件到本地内存,规避远程流权限丢失

你当前在ScaleImageWithThumbnail中才将远程流复制到MemoryStream,但Blazor Server的RemoteJSDataStream依赖浏览器端的文件引用——折叠屏设备可能因状态切换(如屏幕折叠/展开)、系统权限回收,导致浏览器提前释放文件引用。

优化代码:在获取IBrowserFile后立即将文件内容读到本地内存流,再传入后续处理:

private async Task SelectFiles(InputFileChangeEventArgs e)
{
    _hasExceededFileLimit = false;
    try
    {
        _files = e.GetMultipleFiles(5).ToList();

        foreach (var file in _files)
        {
            try
            {
                var placeholder = ImageAttachmentModel.Create(Model.BillId, file.Name, file.ContentType, file.Size);
                Model.Attachments.Add(placeholder);

                // 立即读取文件到本地内存流,避免远程流权限失效
                using var memoryStream = new MemoryStream();
                await using (var fileStream = file.OpenReadStream(100000000L))
                {
                    await fileStream.CopyToAsync(memoryStream);
                }
                memoryStream.Seek(0, SeekOrigin.Begin);

                // 使用本地内存流执行后续命令
                var response = await Mediator.Send(new ProcessAndUploadCommand(
                    Model.BillId, 
                    ImageDataModel.Create(file.Name, file.ContentType, file.Size, memoryStream), 
                    Options.Value.AttachmentMaxImageWidth));

                placeholder.Update(response);
            }
            // ... snip ...
        }
    }
    // ... snip ...
}

2. 排查折叠屏的文件选择场景特殊性

三星折叠屏的系统逻辑可能带来特殊限制:

  • 屏幕折叠/展开时,浏览器进程可能被后台回收或重建,导致临时文件权限丢失
  • 系统对SD卡、私有相册等目录的权限管控更严格

验证步骤:

  • 让用户测试不同来源的图片:相机拍摄照、下载目录文件、系统相册文件,确认是否某类文件必现错误
  • 分别在折叠、展开状态下测试上传,确认是否状态切换触发问题

3. 规范文件流的生命周期与超时管理

Blazor的IBrowserFile.OpenReadStream()返回的流依赖浏览器端资源,若后续处理(图片缩放、网络传输)耗时过长,可能导致浏览器主动释放引用。

优化点:

  • 添加超时取消令牌,避免无限制等待:
using var cts = new CancellationTokenSource(TimeSpan.FromMinutes(2)); // 设置2分钟超时
await using (var fileStream = file.OpenReadStream(100000000L, cts.Token))
{
    // ... 处理逻辑
}
  • 确保ImageDataModel不会长期持有RemoteJSDataStream引用,读取完成后及时释放

4. 验证浏览器适配问题

同款Edge浏览器在折叠屏设备上可能存在API差异:

  • 确认用户的Edge版本,建议更新至最新版后重试
  • 测试Chrome等其他浏览器在同款折叠屏的上传情况,排除Blazor框架本身的问题

5. 补充细粒度日志,定位失败环节

在现有日志基础上添加关键节点日志:

  • 在SelectFiles中记录文件大小、ContentType,尝试通过浏览器API获取文件来源(注意隐私限制)
  • 在ScaleImageWithThumbnail中记录inputData的类型、可读状态,以及CopyToAsync的执行进度,确认错误触发的具体环节

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:01:12