从弹出文件上传文件 - 在IE9中破坏,Works Elsewhere

时间:2011-12-21 06:18:49

标签: file file-upload asp-classic upload internet-explorer-9

我们多年来一直使用我们经典ASP网站的本土文件上传器。它的工作原理如下:

  1. ASP页面设置了一些特定的常量,#包括一个名为Browse-Files.asp的ASP库。
  2. Browse-Files.asp在#including页面内显示目录中目录和文件的文件浏览器视图。它还显示了允许文件修改功能的各种HTML链接 - 创建目录,上传文件,移动,重命名和删除现有文件。
  3. 这些链接中的每一个都调用一个Javascript函数,该函数在弹出窗口中生成一个简单的HTML页面。这些弹出窗口包含所请求的文件修改活动所需的HTML表单。弹出页面的HTML源代码由Javascipt动态生成,而不是加载静态.htm或.asp文件(这纯粹是为了使Browse-Files.asp的所有功能都位于1个文件中)。 / LI>
  4. 用户填写弹出窗体并提交。表单提交回父页面(表单目标属性)并自行关闭(Javascript计时器,window.close)。
  5. 由于表单提交,父页面会刷新,显示用户请求的更改。
  6. 问题是:这种方法在各种浏览器,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 POST的服务器端解析也是如此。

    调试显示文件上传弹出窗口甚至从未将数据提交回父页面(或自身),即表单数据从不首先提交到服务器。但是,所有其他形式的工作方式相同,提交.....

    这可能与代码完全无关,比如IE9安全设置吗?

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

    非常感谢任何帮助。

    由于

    的Lukas

    更新

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

    2)如果我在客户端强制使用兼容性模式(IE9兼容性视图按钮),那么 完全按照预期工作。这是解决方法而不是修复。我认为它确实排除了浏览器设置,因为兼容模式只会影响页面渲染吗?

2 个答案:

答案 0 :(得分:2)

我能够在Windows7和Windows中解决这个问题。通过确保启动window.open()调用的第一个属性有一个可行的URL,IE9(适用于我可以测试的所有其他浏览器和版本)。

我实际上是写(),打开窗口将代码粘贴到我想要的内容中,其中包括文件上传表单。所以我没有一个我需要在打开的窗口上声明的网址。它说&#34;关于:空白&#34;在地址栏中。此外,通过在窗口中点击F12,我可以看到我在尝试提交表单时收到&#34; SCRIPT5:访问被拒绝&#34; 错误。

我正在调用弹出窗口:

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然后允许弹出窗口启动文件上传,我不再收到&#34; SCRIPT5:访问被拒绝&#34;错误。文件开始再次成功上传。

希望有所帮助

答案 1 :(得分:0)

是否对表单属性有9个区分大小写?

尝试改变:

encType="multipart/form-data"

为:

enctype="multipart/form-data"

并清除缓存。