如何在C#MVC3中使用MPXJ .net读取.mpp文件?

时间:2012-08-01 11:53:12

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

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

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

下面是我现在所拥有的代码片段(从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);
        }
    }

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

更新:我已经通过将.MPP文件首先保存到指定的目录来解决问题,然后从该目录中读取(这是在服务器中部署时应该如何)。

答案 1 :(得分:0)

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

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));

    // ...
}

答案 2 :(得分:0)

我已经实现了,但我们遇到了性能问题。要提高应用程序的性能,可以按如下方式实现:

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