HttpPostedFileBase锁定文件

时间:2012-10-08 09:53:28

标签: c# asp.net-mvc asp.net-mvc-4

我正在使用HttpPostedFileBase上传文件。 文件上传没有问题,但是当我尝试从该文件(excel文件)中读取时,我收到一条错误消息,说我无法读取文件,因为它已被锁定。如何从文件中删除锁定/使其不首先锁定文件?

[HttpPost]
        public ActionResult Index(HttpPostedFileBase file)
        {
            string path = string.Empty;
            if (file.ContentLength > 0)
            {
                var fileName = Path.GetFileName(file.FileName);
                path = Path.Combine(Server.MapPath("~/App_Data/"), Guid.NewGuid() + fileName);
                file.SaveAs(path);
                file.InputStream.Flush(); 

                file.InputStream.Close();
                file.InputStream.Dispose();

                // Import the file
                ViewData["FileName"] = fileName;
                //Added to ensure that the file had finished being written by the time      I try and read it
                System.Threading.Thread.Sleep(2000);
            }

            return RedirectToAction("Index", new{fileName = path});
        }

上面的代码读取文件并保存它没有问题,但是下面的代码无法加载该文件:

  

var workbook = excelApp.Workbooks.Open(ExcelDocumentLocation,   Missing.Value,Missing.Value,Missing.Value,Missing.Value,   Missing.Value,Missing.Value,Missing.Value,Missing.Value,   Missing.Value,Missing.Value,Missing.Value,Missing.Value,   Missing.Value,Missing.Value);

我已经确认,通过在Excel中打开文件并看到“文件被其他用户锁定”消息,文件被锁定为问题。

1 个答案:

答案 0 :(得分:3)

您所需要的只是file.SaveAs(path);。您无需刷新或关闭file.InputStream。这将无法锁定文件。

正是从中读取的代码正在锁定它。我看到您在ASP.NET MVC应用程序中使用Office Interop。不要使用它。这从未打算用于多线程环境,例如ASP.NET应用程序。 Office Interop的一个原因是你实际上需要在服务器上安装MS Office,这绝不是那种方式使用的。这是锁定文件的MS Office进程,而不是简单地将其存储在磁盘上的ASP.NET MVC应用程序。

如果要在服务器上操作Office文档,可以使用OpenXML SDK