2012-08-01 45 views
2

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

现在,我的问题是如何从我的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); 
     } 
    } 

任何帮助将不胜感激。

+0

您能否将您的评论转移到答案中,并将答案标记为已接受?它将帮助其他未来有类似问题的人从您的经历中受益。非常感谢! Jon – 2012-08-10 12:26:01

+0

好的@JonIles ...谢谢。 – dmc 2012-08-13 03:22:50

回答

0

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

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

    // ... 
} 
+0

Hi @Farlop,我知道一种方式通过使用[IKVM](http://www.ikvm.net/)直接从HttpPostedFileBase转换为java.io。请看我对答案的细节。 – admin 2014-06-30 03:36:16

0

我implented如你,但我们有一个性能问题。为了提高您的应用程序的性能,您可以实现如下:

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