2

此问题仅在我将其部署到我们的实时服务器时发生,它在我的 Visual Studio Web 服务器的开发机器上运行良好,并且仅在 IE 中存在问题(8 和 9 两者)

使用此表格发布 jpeg...

<form method="post" id="uploadForm" enctype="multipart/form-data" action="/ImageUpload/UploadImageNew">
   <input type="file" onchange="postFile()" name="file"></div>
   <input type="submit" value="OK">
</form>

使用这个 javascript...

function postFile(ctrl) {
    document.getElementById('uploadForm').submit();
}

对这个控制器...

[HttpPost]
public ActionResult UploadImageNew(HttpPostedFileBase file)
{
    // Verify that the user selected a file
    if (file != null && file.ContentLength > 0)
    {
        file.SaveAs("AFilename.file");
     }
     else
     {
         throw new Exception("File not found")
     }
     return View("UploadImageNew");
}

在 IE 中导致 file.ContentLength = 0,但在 FF 和 Chrome 中工作正常,如果这有什么不同,机器就在我们的 Intranet 上。

非常感谢任何帮助

更新 1:

奇怪的是,问题似乎是间歇性的,周五我的同事不能上传任何东西,但我可以,今天早上是我不能,我的同事都可以使用 IE。

一切似乎都指向 IIS 配置问题?

更新 2:

好的,看来我的问题与过期的会话/安全性有关。我正在使用混合身份验证方法,它给我带来了问题。

主站点使用表单身份验证,但是我有另一个站点为我进行 Windows 身份验证并设置 cookie,禁用它为我解决了这个问题。

不知道为什么,但我认为这在另一个问题上会更好。

我将 smartcaveman 的答案标记为正确的答案,因为他的帖子让我得到了正确的答案/解释。

4

3 回答 3

1

您的问题与 IIS 无关。它已损坏,因为您正在使用该change事件进行接线。changeIE 和事件存在已知问题。quirksmode提供了一个表格,其中包含不同浏览器与此事件在不同 HTML 元素上的兼容性。

以下是有关该主题的几篇博客文章:

我想到的最明显的方法是使用blurandfocus方法。(在焦点上记录一个值,在模糊上检查它,如果它不同则提交)。

更新

那么,它仍然无法正常工作吗?这里还有一些其他值得研究的事情。

  1. 如果您在提交之前尝试从客户端的表单字段中获取值,会发生什么情况。例如function postFile(ctrl) { alert(document.getElementById('uploadForm').value); return false; }。它有价值吗?另外,您是否确认该功能在没有 JavaScript 的情况下可以在实时环境中运行?(例如,只需正常提交表格)。如果是这样,那么您可以确定问题出在前端。如果没有,那么 JS 很好,问题出在后端。

  2. 最大请求长度/最大内容长度。在对您的帖子的评论中,您说您在 maxRequestLength 中启用了最多 2GB。但是,这在 IIS7 中的工作方式与在 IIS6(或 Casini,如果那是您之前的测试环境)中的工作方式略有不同。此博客中引用了有关此内容的详细信息,但总的来说,您需要确保您的 web.config 具有 system.webServer 部分中的设置,并且该值实际上代表了您认为它所做的事情。详细信息在文章中。

  3. 你有异常处理和/或日志功能吗?您是否有可能在某处吞下导致请求被放弃的异常?是否有任何空try - catch块可以保护您的视图免受可能导致请求失败的潜在错误的影响?如果您确实启用了日志记录,您能否区分您的尝试使用和您同事的使用?

  4. 实时站点上的文件结构与您的开发环境有什么不同吗?我注意到您有一个硬编码的表单操作/ImageUpload/UploadImageNew目标,这可能会影响应用程序匹配传入路由的能力。

  5. 您在评论中说内容长度为0,但是如果您用来确定此内容的测试是您在帖子中的内容,那么您可能错了。您的测试相当于file == null || file.ContentLength == 0). 根据实际情况,有不同的含义。如果文件为空,则可能与模型绑定有关。如果内容长度为 0,那么它至少识别出正在发送一个文件,但是当它决定如何处理它时出现了问题。HttpContext.Request.Form您可以通过循环遍历集合并写出值来检查您是否实际接收到文件数据(这就是我们过去的做法……在 ASP Classic 时代)。这另一篇文章,Valum 文件上传 - 适用于 Chrome 但不适用于 IE,Image img = Image.FromStream(Request.InputStream), 表示有相同问题的用户在Request.Files集合中找到了文件内容。在你检查之前你不会确定。无论如何,如果文件数据位于其中一个位置,您就知道模型绑定中正在发生问题(并且您知道解决方法,直到找到正确的方法来修复它)。

  6. 我还在Telerik 论坛上发现了一些东西,似乎描述了他们的组件发生的类似事情(这实际上只是你正在做的事情的包装)。它指出可能的会话超时。

我建议仔细阅读这些项目,看看它们是否能揭示更多关于问题的信息(至少 #1 肯定会)。

于 2012-06-06T11:39:48.963 回答
0

上次我在编写基于 ajax 的 UI 时遇到了同样的问题。我使用 ajax.only 上传文件,即为那时创建问题。

不确定,但试试这些链接可能有帮助

Ajax 文件上传在 IE7 Valum 文件上传中不起作用 - 适用于 Chrome 但不适用于 IE,Image img = Image.FromStream(Request.InputStream)

http://haacked.com/archive/2010/07/16/uploading-files-with-aspnetmvc.aspx

您是通过 ajax 还是表单提交 postFile() 保存文件?IE 不像 chrome 和 firefox 那样采用(上传的)文件名。当您上传调试代码并检查它们是否存在时。

于 2012-06-06T01:16:28.767 回答
0

在 IE11 上对我有用的简单解决方案:启用兼容模式

出于某种原因,IE11向我的上传端点发出了两个请求...一个没有文件,工作正常并返回 200 状态(但由于它没有文件,对我来说没用),另一个请求有文件...但是第二个总是“待定”在 IE 内的开发工具的网络选项卡上。我找不到这种奇怪行为的原因。观察来自服务器的日志,我注意到第二个请求从未到达服务器。

然而,这并不能解决每个人的问题,因为您必须要求系统的每个用户为您的网站启用兼容模式......而且要求互联网用户不是一件好事。

于 2019-07-26T18:14:06.467 回答