【问题标题】:How do read .mpp files using MPXJ .net in C# MVC3?如何在 C# MVC3 中使用 MPXJ .net 读取 .mpp 文件?
【发布时间】:2012-07-30 07:29:20
【问题描述】:

我正在尝试使用 C# MVC3 中的 .net 版本的 MPJX 读取 MS 项目文件。 我正在使用 jQuery uploadify 将文件上传到我的控制器。

现在,我的问题是如何从我的 HttpPostedFileBase 文件中读取 ProjectFile = Request.Files[0];读取文件时出现异常,因为 file.FileName 不包含文件的完整路径作为浏览器安全性的一部分。如果我很好或者至少有 Java 方面的知识,那么我只需将发布的文件转换为 java.io.file,因为它是 ProjectReader.read 支持的有效参数之一。

下面是我现在拥有的代码 sn-p(从Example of MPXJ library in C# 的线程中获取代码)。

 [HttpPost]
 public JsonResult UploadTask(int ProjectType)
    {
        try
        {
            HttpPostedFileBase file = Request.Files[0];
            MpxjReader.ProjectReader mppReader = MpxjReader.ProjectReaderUtility.getProjectReader(file.FileName);
            Mpxj.ProjectFile mpp = mppReader.read(file.FileName);

            List tables = mpp.getTables();
            Iterator iter = tables.iterator();
            while (iter.hasNext())
            {
                MpxjCore.Table table = (MpxjCore.Table)iter.next();
                if (table.getResourceFlag())
                {
                    List resources = mpp.getAllResources();
                    Iterator resourceIter = resources.iterator();
                    while (resourceIter.hasNext())
                    {
                        MpxjCore.Resource resource = (MpxjCore.Resource)iter.next();
                        List columns = table.getColumns();
                        Iterator columnIter = columns.iterator();
                        while (columnIter.hasNext())
                        {
                            MpxjCore.Column column = (MpxjCore.Column)columnIter.next();
                            Object columnValue = resource.getCachedValue(column.getFieldType());
                            Console.Write(columnValue);
                            Console.Write(",");
                        }
                        Console.WriteLine();
                    }
                }
                else
                {
                    List tasks = mpp.getAllTasks();
                    // etc. as above
                }
            }

            return Json(new { data = "success" }, JsonRequestBehavior.AllowGet);
        }
        catch
        {
            return Json(new { data = "error" }, JsonRequestBehavior.AllowGet);
        }
    }

任何帮助将不胜感激。

【问题讨论】:

  • 您能否将上面的评论转移到答案中并将答案标记为已接受?它将帮助将来遇到类似问题的其他人从您的经验中受益。非常感谢!乔恩

标签: c# asp.net-mvc-3 ms-project mpxj


【解决方案1】:

更新:我已经解决了这个问题,方法是先将 .MPP 文件保存到指定的目录,然后从该目录中读取(这是在服务器中部署时的行为方式)。

【讨论】:

    【解决方案2】:

    您可以在不将文件存储到文件系统的情况下执行此操作,因此您不必管理它。您可以使用此代码直接读取上传的文件:

    public ActionResult LoadProject(HttpPostedFileBase file)
    {
        // Read file content into byte[]
        var buffer = new byte[file.InputStream.Length];
        file.InputStream.Read(buffer, 0, (int) file.InputStream.Length);                                    
    
        // Read the content using a new 'java' inputStream
        var reader = new MPPReader();                                  
        var project = reader.Read(new java.io.ByteArrayInputStream(buffer));
    
        // ...
    }
    

    【讨论】:

    • 嗨@Farlop,我知道一种使用IKVM 将HttpPostedFileBase 直接转换为java.io 的方法。详细请看我的回答。
    【解决方案3】:

    我已经像你一样实现了,但是我们遇到了性能问题。为了提高您的应用程序的性能,您可以实现如下:

    public ActionResult Upload(HttpPostedFileBase files)
    {
       ProjectReader reader = new MPPReader();
       ProjectFile projectObj = reader.read(new ikvm.io.InputStreamWrapper(files.InputStream));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 2021-06-02
      • 2016-01-28
      • 2020-07-22
      • 2020-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多