2

C#MVC3で.netバージョンのMPJXを使用してMSProjectファイルを読み取ろうとしています。jQueryuploadifyを使用してファイルをコントローラーにアップロードしています。

さて、私の問題は、HttpPostedFileBaseファイルからProjectFileを読み取る方法です= Request.Files [0]; file.FileNameには、ブラウザのセキュリティの一部としてファイルのフルパスが含まれていないため、ファイルの読み取り時に例外が発生します。ProjectReader.readがサポートする有効なパラメーターの1つであるため、私が優れているか、少なくともJavaの知識がある場合は、投稿されたファイルをjava.io.fileに変換します。

以下は私が今持っているもののコードスニペットです(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);
        }
    }

どんな助けでも大歓迎です。

4

3 に答える 3

0

更新:最初に指定されたディレクトリに.MPPファイルを保存し、次にそのディレクトリから読み取ることで、問題を解決しました(これは、サーバーにデプロイされたときの動作方法です)。

于 2012-08-13T03:24:48.460 に答える
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));

    // ...
}
于 2013-11-21T10:23:51.073 に答える
0

私はあなたとして黙認しましたが、パフォーマンスの問題があります。アプリケーションのパフォーマンスを向上させるために、次のように実装できます。

public ActionResult Upload(HttpPostedFileBase files)
{
   ProjectReader reader = new MPPReader();
   ProjectFile projectObj = reader.read(new ikvm.io.InputStreamWrapper(files.InputStream));
}
于 2014-06-30T03:32:59.677 に答える