我的网络表单上有一个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函数,不返回表示成功或失败的值。如何判断文件是否实际上传?
答案 0 :(得分:8)
只需检查它是否存在。
if(File.Exists(myFile)){
//it was uploaded.
}
答案 1 :(得分:4)
您可以检查FileUpload.PostedFile.ContentLength属性
答案 2 :(得分:2)
在调用SaveAs之前,您可以使用File.Exists检查文件是否存在。
答案 3 :(得分:1)
嗯....
不确定我理解。首先,在您的代码中,FileUpload.HasFile将无法编译。如果应该是FileUpload1.HasFile。
当我更正此问题并运行您的代码时,如果该文件不存在,此行将返回false ...
使用File.Exists(路径)上传后,您可以检查文件是否存在;文件对象是System.IO的一部分。
答案 4 :(得分:1)
这与您的实际问题无关,但您应验证任何用户输入,尤其是当您希望用户将文件上传到网络服务器上的虚拟文件夹时。您至少应该检查文件的内容类型是否是您期望的,或者 - 更好的是,使用.NET框架中可用的类过滤(调整大小)图像。
如果您不这样做,用户可能会通过您的网站分享任意内容,或者在您的服务器上放置恶意文件(例如包含可能由某些网络浏览器执行的脚本的图片)。
通过附加验证,您还可以验证是否确实发送了内容。
AND:当您通过连接表单字段的输入来构建保存路径时,会打开一个非常严重的漏洞(我假设UserID.Value
是您提到的POST参数?)。这允许用户决定在服务器上存储内容的位置,更糟糕的是,能够覆盖现有文件!!!