C# System.IO.File.Exists(fpath)在Chrome和Firefox中返回false
我有以下代码可以在InternetExplorer中使用,但不能在Firefox和GoogleChrome中使用C# System.IO.File.Exists(fpath)在Chrome和Firefox中返回false,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我有以下代码可以在InternetExplorer中使用,但不能在Firefox和GoogleChrome中使用 public ActionResult LogoForm(HttpPostedFileBase file) { if (file != null) { string fpath = file.FileName; if (System.IO.File.Exists(fpath)) { // Logi
public ActionResult LogoForm(HttpPostedFileBase file)
{
if (file != null)
{
string fpath = file.FileName;
if (System.IO.File.Exists(fpath))
{
// Logic comes here
}
}
}
我认为:
@using (Html.BeginForm("LogoForm", "LogoEditor", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<text>Logo Image </text>
<input type="file" name="file" id="file" /> <text> </text>
<input type="submit" name="upload" value="Upload" />
}
@使用(Html.BeginForm(“LogoForm”、“LogoEditor”、FormMethod.Post,new{enctype=“multipart/form data”}))
{
标志图像
}
对于Firefox和Chrome中的任何文件,行“if(System.IO.file.Exists(fpath))”总是返回false!它找不到文件。为什么会这样?当你说它在Chrome和Firefox中返回false时,当然不是浏览器在执行你的代码。它是响应请求执行代码的服务器 大概他们给IE提供了不同格式的文件名。你应该记录什么是
file.filename
,这会让事情变得更清楚。看到您只是获取浏览器发布的确切文件名,这有点令人震惊-对于相对文件名,它可能与您想要的目录无关,而对于绝对文件名,您正在比较客户端计算机上的文件是否存在于服务器上的同一位置-这同样,这不是个好主意
编辑:听起来您对客户端计算机上是否确实存在该文件感兴趣。两点:
- 您无法判断,
显然不是正确的检查。谢天谢地,这是在服务器上运行的,而服务器无权访问客户端的文件系统File.Exists
- 你不应该在意。也许客户端没有真正的本地文件系统——也许它是从一些云存储或类似的地方模拟的。你不应该关心这个:你收到了一个关于“文件上传”的请求,而这正是你应该关心的
file.filename
,这会让事情变得更清楚。看到您只是获取浏览器发布的确切文件名,这有点令人震惊-对于相对文件名,它可能与您想要的目录无关,而对于绝对文件名,您正在比较客户端计算机上的文件是否存在于服务器上的同一位置-这同样,这不是个好主意
编辑:听起来您对客户端计算机上是否确实存在该文件感兴趣。两点:
- 您无法判断,
显然不是正确的检查。谢天谢地,这是在服务器上运行的,而服务器无权访问客户端的文件系统File.Exists
- 你不应该在意。也许客户端没有真正的本地文件系统——也许它是从一些云存储或类似的地方模拟的。你不应该关心这个:你收到了一个关于“文件上传”的请求,而这正是你应该关心的
文件。文件名
包含客户端计算机上的文件路径,而不是服务器上的文件路径。您不应该在服务器上使用它。这在IE中起作用的原因是,IE碰巧将文件的完整路径发送到服务器,并且由于您在同一台机器上运行客户机和服务器,所以它可以工作。出于安全原因,Chrome和FF从不发送文件路径。IIRC他们向服务器发送一个虚拟路径,而该路径在任何地方都不存在。当您在IIS中部署应用程序并远程访问它时,这对IE也不起作用
永远不要依赖file.FileName
的路径部分。您应该只提取文件名,然后将其与服务器上的某个路径连接起来:
比如说
[HttpPost]
public ActionResult LogoForm(HttpPostedFileBase file)
{
if (file != null)
{
string path = Path.GetFileName(file.FileName);
string fileName = Path.Combine(Server.MapPath("~/App_Data"), path);
if (File.Exists(fileName))
{
// logic comes here
}
}
}
我还建议您在ASP.NET MVC中查看关于上载文件的。文件名包含客户端计算机上的文件路径,而不是服务器上的文件路径。您不应该在服务器上使用它。这在IE中起作用的原因是,IE碰巧将文件的完整路径发送到服务器,并且由于您在同一台机器上运行客户机和服务器,所以它可以工作。出于安全原因,Chrome和FF从不发送文件路径。IIRC他们向服务器发送一个虚拟路径,而该路径在任何地方都不存在。当您在IIS中部署应用程序并远程访问它时,这对IE也不起作用 永远不要依赖
file.FileName
的路径部分。您应该只提取文件名,然后将其与服务器上的某个路径连接起来:
比如说
[HttpPost]
public ActionResult LogoForm(HttpPostedFileBase file)
{
if (file != null)
{
string path = Path.GetFileName(file.FileName);
string fileName = Path.Combine(Server.MapPath("~/App_Data"), path);
if (File.Exists(fileName))
{
// logic comes here
}
}
}
我还建议您查看关于在ASP.NET MVC中上载文件的信息。Internet Explorer发布原始文件名,包括type=“file”输入控件的路径,而其他浏览器只提供文件名
由于浏览器通常不在服务器上运行,为什么要检查服务器上是否存在完整的文件名?Internet Explorer发布原始文件名,包括type=“file”输入控件的路径,而其他浏览器只提供文件名
由于浏览器通常不在服务器上运行,为什么要检查服务器上是否存在完整的文件名?而不是尝试使用发送到控制器的文件的路径(如其他人所述,仅由Internet Explorer在本地支持),请尝试以下操作:
if (file != null && file.ContentLength > 0)
{
// The fielname
var fileName = Path.GetFileName(file.FileName);
// Store the file inside ~/App_Data/uploads folder for example
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
// Other stuff
}
不要尝试使用发送到控制器的路径(如其他人所述,仅由Internet Explorer本地支持),请尝试以下操作:
if (file != null && file.ContentLength > 0)
{
// The fielname
var fileName = Path.GetFileName(file.FileName);
// Store the file inside ~/App_Data/uploads folder for example
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
// Other stuff
}
只是补充一下人们已经说过的话,如果用户已经将文件添加到文件输入控件,那么它必须存在于cli上