为HTML文件输入元素增添更改值的功能

ZDNet软件频道 时间:2005-01-17 作者:Builder.com |  我要评论()
本文关键词:
出于安全问题的考虑,HTML 文件输入(file input)元素不允许开发人员使用常规的脚本方法更改其元素的值。
本文译自Builder.com,未经许可请勿转载

出于安全问题的考虑,HTML 文件输入(file input)元素不允许开发人员使用常规的脚本方法更改其元素的值。然而,文件输入对于 intranet 应用程序来说是一个非常有价值的东西,然而如果你不能控制这个元素的值,在你需要实现快速简单的解决方案时,它就会束缚你的手脚。在这篇文章中,我提供了一段简单的代码来实现更改文件输入元素的值的功能,然后讨论如何从这一方法中受益。(注:我是在 Visual Basic 6.0 中创建这个示例程序,在 Internet Explorer 6.0 中测试的。

如果你正在使用 .NET 进行开发,那么可能你已经知道了HttpPostedFile类的优点了。它能够提供压缩被上传文件的二进制数据,以及一些关于被上传文件的有用的信息,比如ContentType(MIME 类型)以及被上传文件的FileName。SaveAs() 方法包装将数据转换成文件所需的代码。如果查看联机文档的话,你会发现所有这些信息都很可以很容易地取得。如果将这些信息存储在你可以再次取到的某个地方(比如说存储在数据库中),那么可以很容易地设置 Content-type 头部和文件名。其实你能获得的最大的好处是它能够为你节省在服务器端开发解决方案所需的时间。

现在,如果所有你所要做的只是实现一个基本的浏览器并开发出一个添加文件的解决方案,那么就不需要增加文件输入元素的功能。然而,如果你需要提供一个浏览器按钮以及其它的功能,比如图像扫描解决方案,那么你就需要能够将文件输入元素的值设置为被扫描到的文件的文件名。在这种情况下,如果你使用的是 Internet Explorer,那么你可能会使用一个 ActiveX 或 Web Form 控件来提供扫描功能。其实你还可以用这个控件来设置文件输入元素的值。

文件输入元素的安全性是设置在控件中的,所以没有一个的安全方法可以用来设置文件输入元素的值。然而,如果使用 Visual Basic 6.0,就可以用SendKeys() 函数来“输入”文件输入元素的值。(我之所以选择 VB,是因为我熟悉这门语言,而且大多数 Windows 2000 和 Windows XP 机器都有 VB 运行库。要使用 .NET 技术,你必须首先在客户端计算机上安装 .NET Framework。)

在 VB 中,你可以创建一个公有(public)函数来传入文件输入元素的 ID 和文件的名称:

Public Function SetInputValue(id As String, newValue As String) As String
On Error Resume Next
    Dim doc As MSHTML.HTMLDocument
    Dim inp As MSHTML.HTMLInputFileElement
    Set doc = UserControl.Parent
    Set inp = doc.All.Item(id)
    inp.focus
    SendKeysnewValue, False
    SetInputValue = inp.Value
    Set inp = Nothing
    Set doc = Nothing
End Function

这个非常简单的方法将焦点设置为 HTML 控件,然后执行键序列。你需要在项目中添加一个对 Microsoft HTML Object Library 的引用。

要运行这个例子,你的控件必须允许在浏览器中执行。你还可以选择实现IObjectSafety接口和/或使用一个数字签名安装包。

可以使用下面这个 HTML 来测试前面的代码:

<html>
<head>


function btn_onclick() {
    FileInput1.SetInputValue("file1", "c:test.txt");
}

</script>
</head>
<body>

<input type="file" id="file1">
<OBJECT id=FileInput1 classid="clsid:759F074C-8D49-40E0-B6FC-5AC1169BD29A"
 VIEWASTEXT>
<span style="color:red">ActiveX control could not load. Check your security
 settings.</span>
</OBJECT>
<button id="btn1" onfiltered="btn_onclick()">Click Me</button>


</body>
</html>


Phillip Perkins 的经验从机器控制、客户端服务器编程延伸到企业内部网应用程序。


责任编辑:李宁

欢迎评论投稿

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134