2

在 Internet Explorer 上,标准 HTML 文件上传表单还允许直接输入文件名(而不是使用文件选择器对话框)。这使得输入不存在的文件成为可能。在其他浏览器(不允许您这样做)上,我想如果您在选择文件后删除文件,这种情况仍然会发生。

为了处理由这个问题引起的错误(比如这个),我需要在服务器端添加一些验证代码(这只有在请求实际发送到服务器时才有可能,对此我不确定点),或者在客户端(这不是很简单,因为您无法从 JavaScript 沙箱访问实际文件)。除此之外,唯一(并且可能是最好的)选项似乎是使用 CSS 魔法隐藏输入框,就像 GMail 对附件文件所做的那样。

那么,当您尝试上传不存在的文件时会发生什么?是否仍有 POST 请求正在发送?或者浏览器会中止,如果中止,我如何检测到它?

4

3 回答 3

2

我想我想通了。

首先,似乎只是文件不存在,或者整个路径不正确,这似乎有所不同。如果只有文件丢失,显然 POST 确实发生了。

至少在我提到的情况下(FCKEditor 在 WinXP 和 IE6 上的图像上传对话框),浏览器根本不提交表单(因此没有什么可以在服务器端完成)。

可以在客户端检测到问题,方法是不使用正常的表单提交,而是使用 onSubmit 处理程序来停止提交(返回 false),而是使用 form.submit() 提交表单本身。如果文件丢失,则会出现异常。

try{
   form.submit();
}
catch (e){
// show some error message
}
return false;
于 2008-12-12T05:12:47.887 回答
0

非常好的问题,在 .net 中有 Request.IsClientConnected,但不知道在这种情况下这是否对您有用,或者您是否首先使用 .net。

我会尝试通过客户端的 Fiddler 和服务器端的 WireShark 运行它,看看你是否通过查看流量模式获得任何见解。然后,您可能能够弄清楚如何检测到这一点。

有兴趣看看你想出什么。抱歉无法给出更好的答案。

于 2008-12-11T02:01:41.500 回答
0

该帖子发生了,但至少在 .Net 中,System.Web.UI.WebControls.FileUpload 控件有一个 HasFile 属性,该属性将为 False(我试图上传 c:\tmp\foo.pdf)。在处理之前检查该属性将防止因丢失文件而引起的任何错误。

于 2008-12-11T02:06:46.407 回答