我正在尝试使用C#MVC3中的.net版本的MPJX读取MS项目文件。我正在使用jQuery uploadify将文件上传到我的控制器。
现在,我的问题是如何从我的HttpPostedFileBase file=Request.Files[0]中读取ProjectFile;我在读取文件时遇到异常,因为文件。作为浏览器安全性的一部分,FileName不包含文件的完整路径。如果我擅长或者至少了解java,那么我只会将发布的文件转换为java.io.file,因为它是ProjectReader.read支持的有效参数之一。
下面是我现在拥有的代码片段(从C#中MPXJ库示例中的线程中获得代码)。
[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);
}
}
如有任何帮助,我们将不胜感激。
更新:我已经解决了这个问题,首先将.MPP文件保存到指定的目录,然后从该目录中读取(这就是部署在服务器中时的行为)。
您可以在不将文件存储到文件系统的情况下完成此操作,因此不必管理它。您可以使用以下代码直接读取上传的文件:
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));
// ...
}
我已经和您一样实现了,但我们有一个性能问题。为了提高应用程序的性能,您可以实现如下:
public ActionResult Upload(HttpPostedFileBase files)
{
ProjectReader reader = new MPPReader();
ProjectFile projectObj = reader.read(new ikvm.io.InputStreamWrapper(files.InputStream));
}