我正在使用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);
}
我希望我的解释听起来不含糊。我会尽力回答任何进一步的问题。感谢。
答案 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)
这个问题可能有另一种解决方案。如果您可以在构建时将文件“烘焙”到程序集中,则可以完全避免弄乱路径和文件系统。以下是如何做到这一点:
在Visual Studio解决方案资源管理器中,右键单击文件并转到“属性”。
将构建操作设置为“嵌入资源”。
稍后您可以使用GetManifestResourceStream
来阅读该文件 var stream = GetType()
.Assembly
.GetManifestResourceStream("YourNameSpace.Folder.YourFile.txt");
using (var reader = new StreamReader(stream)) {
var fileContent = reader.ReadToEnd();
}
更多信息here。