Closed li-zheng-hao closed 9 months ago
public static async Task SaveToFileAsync(this Stream stream,string filename)
{
await using FileStream destination = new FileStream(filename, FileMode.Create, FileAccess.Write);
await new BufferedStream(stream, 1048576).CopyToAsync((Stream) destination);
}
测试了一下换成这种写法也不会报错
能否提供一个完整的可独立运行可复现这个bug的demo,我测试是可以正常调用不报错的,这是我的demo代码: ConsoleApp1.zip
我写了几个测试用例也没能复现,我再尝试一下看看
复现了,下面是测试用例:
using Flurl.Http;
using Masuit.Tools.Files;
using Xunit.Abstractions;
[Fact]
public async Task 测试BUG()
{
for (int i = 0; i < 5; i++)
{
var stream=await "https://api.tianditu.gov.cn/cdn/plugins/cesium/Cesium_ext_min.js"
.GetStreamAsync();
await stream.SaveFileAsync("test-err" + Guid.NewGuid().ToString());
}
}
用到的库:
修改版本测试用例通过:
[Fact]
public async Task 修复后()
{
for (int i = 0; i < 5; i++)
{
var stream=await "https://api.tianditu.gov.cn/cdn/plugins/cesium/Cesium_ext_min.js"
.GetStreamAsync();
// await stream.SaveFileAsync("test-err" + Guid.NewGuid().ToString());
await FixedSaveToFileAsync(stream, "test-err" + Guid.NewGuid().ToString());
}
}
static async Task FixedSaveToFileAsync(Stream stream,string filename)
{
await using FileStream destination = new FileStream(filename, FileMode.Create, FileAccess.Write);
await new BufferedStream(stream, 1048576).CopyToAsync((Stream) destination);
}
这个是用法问题了,Http响应流不能直接拿来存文件流,需要先转MemoryStream再用
这个是用法问题了,Http响应流不能直接拿来存文件流,需要先转MemoryStream再用
如果是这样的话,扩展方法的this应该用MemoryStream类型更好吧,不然stream的变量点一下之后就出来了这个扩展方法,很容易写出bug诶
Stream体系本来就很混乱,各种各样的实现,但是又不能限定只能给MemoryStream做扩展,很多其他的流类型也是可以正常转储文件的
遇到不能直接转储文件的Stream就借助MemoryStream中转一下咯
遇到不能直接转储文件的Stream就借助MemoryStream中转一下咯
那也只能这样了 ...🤣
温馨提示:提交后请保证回复及时,若长时间未回复的issue,将在超过30天以后作关闭处理!
bug描述
是哪个类的哪个函数出现了bug?
异常堆栈信息
函数入参
期望的结果或输出
正常保存
使用环境:
您的一些其他的想法
针对SaveFileAsync写了一些测试用例,发现复现不了这个问题,但是我换成下面这种写法又不会报错了
看了一下源码:
感觉是这里哪个Stream在没真正copy时就被销毁了