ASP.NET 文件函数不适用于 MemoryStream 但如果复制到临时文件,它可以

ASP.NET File function doesn't works with MemoryStream but if copied to temp file, it does

以下代码有效:

MemoryStream s = TarCreator.CreateTar(toDownload);
string path = Path.GetTempFileName();
using (var newFile = System.IO.File.OpenWrite(path))
    s.CopyTo(newFile);
return File(System.IO.File.OpenRead(path), MimeTypes.MimeTypeMap.GetMimeType(".tar"), "test.tar");

如果我将其更改为直接使用 MemoryStream,它不起作用并给我一个 500 内部服务器错误。

return File(TarCreator.CreateTar(toDownload), MimeTypes.MimeTypeMap.GetMimeType(".tar"), "test.tar");

我的CreateTar函数如下:

public static Stream CreateTar (string dir)
{
    MemoryStream stream = new();
    using (TarArchive tarArchive = TarArchive.CreateOutputTarArchive(stream))
    {
        tarArchive.IsStreamOwner = false;
        tarArchive.RootPath = dir.Replace('\', '/');
        if (tarArchive.RootPath.EndsWith("/"))
            tarArchive.RootPath = tarArchive.RootPath.Remove(tarArchive.RootPath.Length - 1);
        AddDirectoryFilesToTar(tarArchive, dir);
    }
    return stream;
}

在 return 之前调用 stream.Position = 0(或者如果有原因,CreateTar 应该 return 一个指向自身末尾的流,将其捕获到一个变量中,然后在将位置传递给 File(...))

之前重置位置