1

我的 Web 表单上有一个 FileUpload 控件 (FileUpload1),还有一个“Sumbit”按钮、一个标签和一个包含 UserID 的隐藏字段。我在按钮的单击事件中有以下代码:

string path = Server.MapPath("~/userfiles/");

if (FileUpload.HasFile)
{
    try 
    {
        FileUpload1.SaveAs(path + UserID.Value + "/image.jpg");
    }
    catch 
    {
        Label1.Text = "* unable to upload file";
        Label1.Visible = true; 
    }
}

如果我上传一个实际的文件,它会很好。但是,如果我在 FileUpload 的文本框中键入一个不存在的文件名(例如,“c:\a.jpg”,它在我的计算机上不存在),然后单击 Sumbit 按钮,HasFile 仍然返回 true。此外,SaveAs() 不会抛出任何异常,它是一个 void 函数,不返回指示成功或失败的值。如何判断文件是否实际上传?

4

5 回答 5

8

只需检查它是否存在。

if(File.Exists(myFile)){
  //it was uploaded.
}
于 2009-03-10T20:17:13.897 回答
4

您可以检查 FileUpload.PostedFile.ContentLength 属性

于 2009-03-10T20:30:09.560 回答
2

您可以在调用 SaveAs 之前使用 File.Exists 检查文件是否存在。

于 2009-03-10T20:17:21.447 回答
1

嗯……

不确定我是否理解。首先,在您的代码中, FileUpload.HasFile 不会编译。如果应该是 FileUpload1.HasFile。

当我更正此问题并运行您的代码时,如果文件不存在,此行将返回 false ...

您可以使用 File.Exists(path); 上传后检查文件是否存在;文件对象是 System.IO 的一部分。

于 2009-03-10T20:32:03.393 回答
1

这与您的实际问题无关,但您应该验证任何用户输入,特别是如果您希望用户将文件上传到您的网络服务器上的虚拟文件夹。您至少应该检查文件的内容类型是否符合您的预期,或者 - 更好的是,使用 .NET 框架中可用的类过滤(调整大小)图像。

如果您不这样做,用户可能会通过您的站点共享任意内容或在您的服务器上放置恶意文件(例如,包含可能被某些 Web 浏览器执行的脚本的图像)。

通过额外的验证,您还可以验证是否确实发送了内容。

并且:当您通过连接来自表单字段的输入来构建保存路径时,会出现一个非常严重的漏洞(我假设UserID.Value是您提到的 POST 参数?)。这允许用户决定在您的服务器上存储内容的位置,更糟糕的是,能够覆盖现有文件!!!

于 2009-03-10T21:06:08.227 回答