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(...)
)
之前重置位置
以下代码有效:
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(...)
)