在IE9中破坏,在其他地方工作

我们几年来一直使用我们的经典ASP网站的本土文件上传器。 它是这样工作的:

  • ASP页面设置一些特定的常量,并包含一个名为Browse-Files.asp的ASP库。
  • Browse-Files.asp在#including页面内显示目录中的目录和文件的文件资源管理器视图。 它还显示各种HTML链接以允许文件修改功能 - 创建目录,上传文件,移动,重命名和删除现有文件。
  • 这些链接中的每一个都会调用一个JavaScript函数,它在弹出窗口中生成一个简单的HTML页面。 这些弹出窗口包含所需文件修改活动所需的HTML表单。 弹出页面的HTML源代码由Javascipt实时生成,而不是加载静态.htm或.asp文件(这纯粹是为了使Browse-Files.asp的所有功能位于1个文件中)。
  • 用户填写弹出窗体并提交。 表单提交回父页面(表单目标属性)并关闭自身(Javascript计时器,window.close)。
  • 由于表单提交,父页面将刷新,显示用户请求的更改。
  • 问题是:这在多种浏览器,IE 6至8,Firefox和Opera上运行良好。 但是,在IE9中,文件上传不起作用。 其他基于弹出式的任务,如文件重命名和目录创建继续工作。

    代码 - 文件重命名弹出(在IE9和所有之前):

    <html>
    <head>
    <title>Rename</title>
    <link rel="stylesheet" href="/Common/CSS/screen.css" type="text/css" media="screen" />
    </head>
    <body>
    <h1>Rename</h1>
    <p>Enter the new name for "Config Mgmt Text.txt" in the folder "General/Share-Files/":</p>
    <form name="form" method="post" action="/General/Share-Files.asp" encType="multipart/form-data" target="Browse-Files" onSubmit="self.setTimeout('window.close()', 500)">
    <input name="task" type="hidden" value="T03" />
    <input name="path" type="hidden" value="General/Share-Files/" />
    <input name="target" type="hidden" value="Config Mgmt Text.txt" />
    <input name="name" type="text" tabindex="1" size="40" value="Config Mgmt Text.txt"></input>
    <input name="submit" type="submit" value="Rename" tabindex="2" />
    </form>
    </body>
    </html>
    

    代码 - 文件上传弹出(在IE9中破解,以前都可以):

    <html>
    <head>
    <title>Add Files</title>
    <link rel="stylesheet" href="/Common/CSS/screen.css" type="text/css" media="screen" />
    </head>
    <body>
    <h1>Add Files</h1>
    <p>Browse for files to add to the folder "General/Share-Files/":</p>
    <form name="form" method="post" action="/General/Share-Files.asp" encType="multipart/form-data" target="Browse-Files" onSubmit="self.setTimeout('window.close()', 500)">
    <input name="task" type="hidden" value="T01" />
    <input name="path" type="hidden" value="General/Share-Files/" />
    <input name="file1" type="file" tabindex="1" size="40"></input><br />
    <input name="file2" type="file" tabindex="2" size="40"></input><br />
    <input name="file3" type="file" tabindex="3" size="40"></input><br />
    <input name="file4" type="file" tabindex="4" size="40"></input><br />
    <input name="file5" type="file" tabindex="5" size="40"></input><br />
    <input name="submit" type="submit" value="Upload Files" tabindex="6" />
    </form>
    <p>Note that upload speed depends on your internet connection speed.</p>
    </body>
    </html>
    

    所有的表单都是encType="multipart/form-data"来容纳文件上传,并且主页上的ASP首先用表单数据执行Request.BinaryRead(Request.TotalBytes) 。 然后它通过分隔符分析数据,将其分成二进制数据(上载文件)和文本数据(常规表单字段)。 其中一个常规表单域<input name="task" type="hidden" value="T01" /> ,它知道如何处理提交的数据(重命名文件,上传文件等)。

    那么,为什么上传,只上传,不能在IE9中工作?

    如上所述,表单提交方法与上传和其他(工作)表单操作相同,HTTP服务器端解析HTTP POST也是如此。

    调试表明,文件上传弹出窗口甚至不会将数据提交回父页面(或自身),也就是说,表单数据永远不会提交给服务器。 但是,所有其他形式的工作方式相同,并提交.....

    这可能是完全不相关的代码,如IE9的安全设置?

    甚至在IE9上尝试强制IE8兼容模式( <meta http-equiv="X-UA-Compatible" content="IE=8" > ),没有任何改变。

    任何帮助非常感谢。

    谢谢

    卢卡斯

    更新:

    1)“不起作用”意味着上传弹出消息在提交时消失(因为它应该),但没有任何事情提交给父页面。 如果我禁用弹出窗口中的自动关闭功能:单击提交后,将清除包含要上载的文件路径的文本字段,但不会发生任何其他情况。 这表明它正在提交到弹出页面而不是父页面,但这并没有什么意义,因为其他(在IE9下工作)弹出页面仍然正确地提交到父页面。 我会尝试用传统的ASP页面替换JS生成的弹出页面,该页面可以显示任何HTTP POST数据,然后从那里开始。

    2)如果我在客户端强制兼容模式(IE9兼容性视图按钮),它确实按照它应该的方式工作。 尽管如此,这是更多的解决方法。 我想它确实排除了浏览器设置,因为相容性模式只会影响页面渲染。


    我可以通过确保初始化window.open()调用的第一个属性中有一个可行的url来解决Windows7和IE9中的这个问题(可以在所有其他浏览器和我可以测试的版本中工作)。

    我实际上是在打开的窗口中写入()以将代码粘贴到我想要的中,其中包括文件上载表单。 所以我没有需要在打开的窗口上声明的url。 它在地址栏中显示“about:blank”。 此外,通过在窗口中点击F12,我可以看到当我尝试提交表单时,出现了“SCRIPT5:Access is denied”错误。

    我正在像这样调用弹出窗口:

    var popup_window = window.open("","upload_popup_window_name","menubar=1,resizable=1,scrollbars=1,width=630,height=400");
    

    通过将以上更改为:

    var popup_window = window.open("/blank.html","upload_popup_window_name","menubar=1,resizable=1,scrollbars=1,width=630,height=400");
    

    / blank.html是一个实际的文件,Web服务器根据请求返回了200个代码(尽管它实际上可能是你想要调用的url的源,但我假设你已经这样做了,会工作)。

    我仍然通过document.write()将我自己的所有代码覆盖到窗口中,这些窗口的内容仍然是我之前做的。

    通过做这个小的修改,IE9允许文件上传通过弹出窗口进行INITIATED,并且不再收到“SCRIPT5:Access is denied”错误。 并且文件开始再次成功上传。

    希望有所帮助


    即9即对您的表单属性区分大小写?

    尝试改变:

    encType="multipart/form-data"
    

    至:

    enctype="multipart/form-data"
    

    并清除您的缓存。

    链接地址: http://www.djcxy.com/p/36521.html

    上一篇: Broken in IE9, Works Elsewhere

    下一篇: Streamed html from SQL doesn't display images in IE9