ASP.NET MVC网站从磁盘问题中读取文件

时间:2011-04-18 06:00:18

标签: c# asp.net-mvc

我正在使用C#在我正在研究的MVC网站上读取包含SQL插入语句的文本文件。调试我正在使用的函数工作正常,插入发生。但是,一旦我发布该网站并在我的本地计算机上运行它(使用IIS设置甚至使用asp.net 4.0)它似乎不起作用。

        if (Request.Files != null && Request.Files["txtImportFile"] != null)
        {
            //newFilePath = Server.MapPath("\\" + DateTime.Now.Ticks + Request.Files["txtImportFile"].FileName);
            string[] temp_string = Request.Files["txtImportFile"].FileName.Split(new char[] { '\\' });
            string temp_filename = temp_string[temp_string.Count() - 1];
            //newFilePath = Server.MapPath("\\temp\\" + DateTime.Now.Ticks + Request.Files["txtImportFile"].FileName);
            newFilePath = Server.MapPath("\\temp\\" + DateTime.Now.Ticks + temp_filename);
            Request.Files["txtImportFile"].SaveAs(newFilePath);

            StreamReader reader = new StreamReader(newFilePath);
            string contents = reader.ReadToEnd();
            reader.Close();

            Models.WingsRemoteDbLibrary dbLib = new Models.WingsRemoteDbLibrary();
            string update_message = dbLib.UpdateSlaveItemsTable(contents);

            if (System.IO.File.Exists(newFilePath))
                System.IO.File.Delete(newFilePath);

            RandomPopupView(update_message);
        }

我希望我的解释听起来不含糊。我会尽力回答任何进一步的问题。感谢。

3 个答案:

答案 0 :(得分:4)

解决方法:

而不是使用

Server.MapPath("\\temp\\"...

在root下创建名为“temp”的文件夹并使用

System.Web.HttpContext.Current.Request.MapPath("~\\temp....

答案 1 :(得分:1)

嗯,“它似乎不起作用”非常模糊 - 更多细节会很好!但这听起来像是权限问题。 IIS中的默认配置文件几乎无法访问磁盘,尤其是写访问权限。在你自己的网站中编写 (我自己使用磁盘中不相关的部分)并不是一个好主意,但你需要配置IIS来运行应用程序。特定的名为的身份,可以访问磁盘。不幸的是,配置帐户本身(不是IIS - 帐户;例如授予“作为服务登录”)作为ASP.NET帐户运行并不是特别微不足道。

另一个想法是:您的应用是一个子应用,即您的应用根[{1}},还是/?我问的原因是你对/MyApp/的使用可能比app-root更好地表达,即MapPath - 但我再次强调;在应用程序内部写作是有风险的。您确实希望该文件夹不执行。

答案 2 :(得分:0)

这个问题可能有另一种解决方案。如果您可以在构建时将文件“烘焙”到程序集中,则可以完全避免弄乱路径和文件系统。以下是如何做到这一点:

  1. 在Visual Studio解决方案资源管理器中,右键单击文件并转到“属性”。

  2. 将构建操作设置为“嵌入资源”。

  3. 稍后您可以使用GetManifestResourceStream

    来阅读该文件
        var stream = GetType()
            .Assembly
            .GetManifestResourceStream("YourNameSpace.Folder.YourFile.txt");
    
        using (var reader = new StreamReader(stream)) {
            var fileContent = reader.ReadToEnd();
        }
    

    更多信息here