如何利用writeAsBytes()判断文件上传操作是否成功完成?
问题分析与解决方案
一、两种场景返回结果相同的原因
FileMode.append的设计逻辑是:
- 若目标文件不存在,自动创建新文件并写入字节
- 若目标文件已存在,在文件末尾追加字节内容
这两种情况都会成功执行writeAsBytes,所以返回的File实例状态一致,不会因为文件已存在而返回失败。你所说的“实际并未完成上传”,大概率是误解了append模式的行为——它不会替换原有文件,而是在原有内容后追加数据,并非上传失败。
二、如何通过writeAsBytes直接判断写入成功?
writeAsBytes是异步操作,只要不抛出异常,就代表写入操作已完成,但如果需要验证数据是否正确写入,可以通过以下方式:
1. 捕获异常判断基础写入成功
用try-catch包裹操作,捕获写入时的异常(如权限不足、磁盘空间不足、路径无效等):
try { File fileResult = await file.writeAsBytes(byte, mode: FileMode.append); // 走到这里代表写入操作已执行完成 } catch (e) { // 写入失败,处理异常(如打印错误、提示用户) print('写入失败:$e'); }
2. 验证字节数匹配(确保数据完整写入)
如果需要确认字节是否完整写入,可以对比写入前后的文件长度:
int? preFileLength; if (await file.exists()) { preFileLength = await file.length(); } try { File fileResult = await file.writeAsBytes(byte, mode: FileMode.append); int postFileLength = await fileResult.length(); // 验证写入的字节数是否符合预期 bool isDataComplete = preFileLength == null ? postFileLength == byte.length // 新文件:长度等于写入字节数 : (postFileLength - preFileLength) == byte.length; // 追加:长度增量等于写入字节数 if (isDataComplete) { print('数据完整写入成功'); } else { print('数据写入不完整'); } } catch (e) { print('写入失败:$e'); }
三、fileResult.isAbsolute始终为false的原因
isAbsolute返回false,是因为你创建File对象时使用的是相对路径。如果需要获取绝对路径的File实例,可以:
- 直接用绝对路径初始化
File(如File('/storage/emulated/0/your_folder/1.png')) - 通过
file.absolute转换为绝对路径实例:
File absoluteFile = file.absolute; print(absoluteFile.isAbsolute); // 会返回true
额外建议
如果你的需求是覆盖已存在的文件而非追加内容,应该使用FileMode.write(这也是writeAsBytes的默认模式),此时文件存在会被完全覆盖,不存在则创建:
File fileResult = await file.writeAsBytes(byte); // 默认mode为FileMode.write
内容的提问来源于stack exchange,提问作者Sittiphan Sittisak
相关产品推荐
相关产品推荐

