C# System.IO.File.Exists(fpath)在Chrome和Firefox中返回false

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

我有以下代码可以在InternetExplorer中使用,但不能在Firefox和GoogleChrome中使用

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 &nbsp;&nbsp;&nbsp;</text>
    <input type="file" name="file" id="file" /> <text> &nbsp; &nbsp; &nbsp;</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
    显然不是正确的检查。谢天谢地,这是在服务器上运行的,而服务器无权访问客户端的文件系统
  • 你不应该在意。也许客户端没有真正的本地文件系统——也许它是从一些云存储或类似的地方模拟的。你不应该关心这个:你收到了一个关于“文件上传”的请求,而这正是你应该关心的

当你说它在Chrome和Firefox中返回false时,当然不是浏览器在执行你的代码。它是响应请求执行代码的服务器

大概他们给IE提供了不同格式的文件名。你应该记录什么是
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上