如何将FileStreamResult转换为IFormFile?

10
我使用这段代码改变图像的大小。但是这种方法返回FileStreamResult。我想将FileStreamResult转换为 IFromFile 。我怎么做?
注意:我正在使用CoreCompat来改变图像的大小。
public FileStreamResult ChangeSize(IFormFile file)  
{
    using (var img = System.Drawing.Image.FromStream(file.OpenReadStream()))
    {
        Stream ms = new MemoryStream(img.Resize(100, 100).ToByteArray());

        return new FileStreamResult(ms, "image/jpg");
    }
}
2个回答

7

这适用于文件,但似乎无法复制其他数据,例如内容类型

public IFormFile GetFormFile(FileStreamResult fsr)
{
    using (var fs = fsr.FileStream)
    {
        file = new FormFile(fs, 0, fs.Length, "name", fsr.FileDownloadName);
    }
}

3
这应该能够将你的FileStreamResult转换为FormFile:
public IFormFile ReturnFormFile(FileStreamResult result)
{
    var ms = new MemoryStream();
    try
    {
        result.FileStream.CopyTo(ms);
        return new FormFile(ms, 0, ms.Length);
    }
    catch(Exception e){
       ms.Dispose();
       throw;
    }
    finally
    {
        ms.Dispose();
    }
}

你为什么选择不使用 using 语法? - Captain Prinny
"Using" 只是 try/finally 的语法糖。如果你查看编译后的 ILASM 代码,"using" 和 "try/catch/finally" 看起来非常相似。唯一的区别在于,在这种情况下,我应该添加一个 "Catch" 来更好地捕获和处理异常。 - Kevin B Burns
@PoulBak 有点像,但无论哪种方式,你只是让它在堆上冷却,等待GC来清理你的混乱。通过使用“using”进行包装,或告诉它要Dispose将使其失效,并在准备好清理时告诉GC。否则,它将只是坐在那里浪费内存,如果它是一个大的字节数组,可能会造成一些麻烦。 - Kevin B Burns
@PoulBak 无论如何,让人们养成释放继承自IDisposable的对象的习惯仍然是一个好习惯,所以我不知道你为什么要烦我这个事情。其次,通过内存分析器运行它并告诉我是否有差异。GC不会自动立即挽救局面,有世代对象等待从堆中清除。如果这是一个递归函数,我们生成了20个具有1GB字节的内存流,您希望尽快清理它。 - Kevin B Burns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接