代码之家  ›  专栏  ›  技术社区  ›  trinalbadger587

ASP。NET File函数不适用于MemoryStream,但如果复制到临时文件,它会

  •  0
  • trinalbadger587  · 技术社区  · 3 年前

    以下代码有效:

    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;
    }
    
    1 回复  |  直到 3 年前
        1
  •  2
  •   Caius Jard    3 年前

    呼叫 stream.Position = 0 在返回它之前(或者如果CreateTar应该返回指向其末端的流是有原因的,请将其捕获到变量中,并在将其传递到之前重置位置 File(...) )