C# 库 MPXJ 是否能够从 MemoryStream 中读取文件?

Is the C# library MPXJ able to read in a file from a MemoryStream?

我正在使用 the library MPXJ,效果很好,但我现在希望用户能够上传自己的文件(asp.net-mvc 站点),它以服务器端形式出现 post 作为 HttpPostedFileBase 然后我使用以下方法转换为内存流:

    var stream = new MemoryStream();
    httpPostedFile.InputStream.CopyTo(stream);

鉴于此,我正在尝试弄清楚如何将它作为 MemoryStream 读取(相对于磁盘上的文件位置)

现在我有这样的东西:

    public ProjectFile Import(string filePathandName)
    {
        MPPReader reader = new MPPReader();
        ProjectFile project = reader.read(filePathandName);

我想要这样的东西:

    public ProjectFile Import(MemoryStream stream)
    {
        MPPReader reader = new MPPReader();
        ProjectFile project = reader.read(stream);

这可能吗"natively" 还是我需要将文件保存在我的服务器上然后从那里读取(尽量避免该选项)?

MPPReader.Read() 方法只接受 4 种类型的参数,none 其中是 MemoryStream,除了一种似乎是库本身定义的类型:

  • java.io.File
  • java.io.InputStream
  • org.apache.poi.poifs.filesystem.POIFSFileSystem
  • 字符串

您目前正在使用 string 参数,因为它需要一个路径,但是您可能得到的最接近的方法似乎是尝试将现有的 MemoryStream 对象复制到 InputStream 在库中找到类型并使用它(如果存在该类型的支持)。

MPXJ 附带一对 classes,称为 DotNetInputStreamDotNetOutputStream,它们充当 .Net 流的包装器,以便它们可以在 MPXJ 期望的地方使用 Java InputStreamOutputStream.

这里是来自DotNetInputStream的相关评论:

/// <summary>
/// Implements a wrapper around a .Net stream allowing it to be used with MPXJ
/// where a Java InputStream is expected.
/// This code is based on DotNetInputStream.java from the Saxon project http://www.sf.net/projects/saxon
/// Note that I've provided this class as a convenience so there are a matching pair of
/// input/output stream wrapper shopped with MPXJ. IKVM also ships with an input stream wrapper:
/// ikvm.io.InputStreamWrapper, which you could use instead of this one.
/// </summary>

您应该能够使用这个 class 来实现您在问题中描述的内容。