【问题标题】:MVC 4 - Upload Doesn't Work in IE When deployed to IIS 7.5MVC 4 - 部署到 IIS 7.5 时,上传在 IE 中不起作用
【发布时间】:2012-06-06 01:08:02
【问题描述】:

此问题仅在我将其部署到我们的实时服务器时发生,它在我的 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 的答案标记为正确的答案,因为他的帖子引导我找到正确的答案/解释。

【问题讨论】:

  • 上传的文件有多大?
  • 远射,但您是否尝试在文件输入中添加“id”。例如:
  • 文件不是很大,我已经更改了我的 web.config 以允许文件最大为 2gb。
  • 我还在输入中添加了一个 id 元素,那里也没有变化

标签: asp.net-mvc internet-explorer iis-7.5 asp.net-mvc-4 httppostedfilebase


【解决方案1】:

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

这里有几篇关于这个主题的博客文章:

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

更新

所以,它仍然无法正常工作?以下是一些值得研究的其他事项。

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

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

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

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

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

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

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

【讨论】:

  • 好吧,试试看,不相信表单确实提交了,但我想它可以在附加文件之前提交?很快回来
  • 如果您查看 quirksmode 链接,您会看到有一些支持,但它与 FF 和 IE 中的工作方式不同
  • 我认为唯一可能由于环境而发生的事情是,如果您的安全设置过于严格,您将无法访问该文件
  • 好的,我已经做了一些日志记录,onchange 似乎在 IE 中可以正常触发,但是为了确保我也使用 onblur/onfocus 技巧完成了它并遇到了同样的问题,还尝试使用一个正在检查更改的 setInterval,仍然存在同样的问题。
  • @NoseBagUK,我发布了一些可能有帮助的想法。让我知道这是怎么回事,一定要进行测试以确认 JS 是否真的是罪魁祸首。
【解决方案2】:

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

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

Ajax file upload not working in IE7 Valum file upload - Works in Chrome but not IE, Image img = Image.FromStream(Request.InputStream)

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

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

【讨论】:

  • 我已经修改了原始问题以显示 postFile() 函数。这只是一个标准的上传。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多