如何防止FileUpload控件在回发时清空?

6

我在使用FileUpload控件时遇到了一些问题,想知道是否能够得到一些帮助。

我的页面上有一个FileUpload控件和一个下拉列表。

因此,用户浏览到他们想要的文件,然后从下拉列表中选择选项(这将启用页面上还有的一些复选框,取决于他们在下拉列表中的选择)。这将导致FileUpload控件变为空,并且现在用户必须再次浏览到他们想要的文件。

有没有什么方法可以防止FileUpload控件在PostBack期间丢失其内容?


另一种可能更复杂的服务器端实现在Persist FileUpload Control Value中。 - Michael Freidgeim
7个回答

9
由于安全问题,除了浏览器之外,任何东西都无法设置元素中的路径。 因此,如果您尝试了Relster的建议但未成功,则Spencer是正确的。 唯一的解决方案是重新构造流程,以便只有在要提交文件时才进行任何后续操作,并使用客户端脚本进行任何其他操作。
您不能设置路径的原因是它会允许您窃取用户的文件。 例如,如果您隐藏输入并为后续操作提供一个看似无害的按钮,则可以将文件输入的默认路径设置为您想要访问的内容,而用户则不知道正在发生什么。

谢谢,我肯定会考虑使用客户端脚本来在下拉列表更改时执行所需的页面更改。 - Denis Sadowski
似乎不是很大的安全风险;用户首先必须点击文件上传选项,选择文件,并等待其上传。我倾向于在网站上不选择上传文件,除非我想要该站点/页面首先接受文件。唯一的“技巧”/“窃取”是隐藏何时/ 是否上传了文件。据我所知,浏览器不能在未提示用户选择任何内容之前自动从计算机中收集文件,因此像您描述的“设置默认路径”并不可信。 - TylerH
@TylerH 我明白问题所在。用户选择上传cat-picture.jpg。然后点击无害的按钮。上传文件被更改为包含他所有银行账户和信用卡号码列表的文件。即使新文件名被显示,用户在点击提交之前会想到查看它吗?也许会,也许不会。当然,黑客必须知道计算机上敏感文件的路径名称,但是他可以通过使用常见软件产品的名称(如流行的会计软件),使用默认安装位置来猜测。 - Jay
当然,如果用户没有安装那个特定的应用程序,上传将失败。但是黑客并不指望每次攻击都能成功。他们玩的是概率。 - Jay
@Jay Ah,是的,浏览器不允许这样做,但我认为Sean所说的并不是这个;我认为他指的是浏览器更改目标文件路径。显然,浏览器根本不应该能够更改输入文件路径,正如你提到的那样。 - TylerH

5

所以,如果我理解正确的话,下拉框的autopostback属性被设置为true,您正在检查下拉框的值来对复选框进行默认更改?

相反,尝试使用客户端脚本来完成您的想法。


是的,下拉框具有AutoPostback属性。我认为我已经将实际的asp放入了我的帖子中,但我可能忘记了或者它被过滤出了我的帖子。 - Denis Sadowski
下拉列表改变事件会发生什么?页面功能是否会发生重大改变? - Robert Koritnik

2
我很可能会使用客户端脚本来解决这个问题。
然而,我找到了一种使用ajax的解决方案,对于那些可能感兴趣的人来说。

http://forums.asp.net/t/1125781.aspx

从Jessica Cao的帖子中,其中还包含一个代码示例:
“…您可以使用AJAX向服务器进行异步回传,使包含DropDownList的部分页面进行回传,而包含FileUpload控件的页面不会回传,因此FileUpload将保持FilePath。”
这种方法需要使用System.Web.Extensions.dll,并因此需要 .Net 3.5 Framework。

1

防止上传控件在回传时丢失文件的简单解决方案是将上传控件放在 .aspx 页面的 update panel 控件之外。换句话说,将可能触发回传的所有输入控件放在一个更新面板内。

例如:

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <ajax:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server"></ajax:ToolkitScriptManager>
    <table>
        <tr>
            <td>
                <asp:UpdatePanel runat="server" ID="Up_LeaveDetails" UpdateMode="Always">                                 
                    <ContentTemplate>
                        <asp:DropDownList ID="DDl_LeaveType" runat="server" CssClass="textfield" Width="150" AutoPostBack="true" OnSelectedIndexChanged="DDl_LeaveType_SelectedIndexChanged">
                        </asp:DropDownList>
                    </ContentTemplate>
                 </asp:UpdatePanel>
            </td>
            <td>
                <asp:FileUpload ID="UploadCertificate" runat="server" />
            </td>
        </tr>
    </table>
</asp:Content>

1

我将自动回发控件包裹在一个asp:updatepanel中,这样做就解决了问题,但验证失败除外。


如果您将验证元素(例如 asp:regularexpressionvalidator)放置在 updatepanel 中与它们正在验证的输入元素一起,则不应该出现验证问题。 - TylerH

1

每当有一个postback时,您必须检查是否还有来自客户端的文件并保存它。但是您将无法在客户端上重新填充输入框。我建议您最好隐藏文件上传控件(除非您允许多个文件上传),并在其旁边显示带有复选标记的文件名。类似于GMail,当您向电子邮件消息上传文件时。

原因是安全问题,正如其他人所指出的。

我还会禁用任何自动postbacks,因为如果上传文件大小足够大,下拉列表更改可能会对客户端产生永恒的影响。


0

你不能这样做。一个简单的解决方案是转移到 Ajax 文件控件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接