带有覆盖消息的 ASP.NET 文件上传器
带有覆盖提示和文件归档的 Intranet 文件上传对话框。
引言
此 ASP.NET 应用程序是一个文件上传器对话框,可以从经典 ASP 中调用。它专为在 Intranet 站点中使用而设计。文件上传器将覆盖警告显示为弹出窗口或警告消息。被覆盖的文件将使用附加到文件名的时间戳进行归档。检查文件是否已经存在是最大的障碍。FileExists
Java 函数使用 ActiveX 控件,这会导致浏览器安全警告。解决办法是通过调用 AJAX Web 服务来访问代码隐藏例程。
背景
我需要一个用于我的 ASP Classic Intranet 站点的文件上传器对话框,但我找不到任何能满足我需求的东西。我想在覆盖现有文件之前提示用户。此外,我希望在上传完成后显示所选文件名。似乎 FileUploader
控件在上传文件后会清除文件名。我还需要将旧文件归档给用户。
使用代码
仅当您已安装 AJAX 时才打开该项目。
此项目需要 IE6、ASP.NET 2.0、AJAX 和 JavaScript。该项目是自包含的,包含所有必需的文件和图像,可以作为演示运行。必须在服务器上正确设置目录权限,以允许 Internet 来宾帐户写入目录。
必须在示例 HTML 页面和 web.conf 中设置变量以匹配您的需求。请务必将 testupload.htm 设置为项目的启动页面。
可以通过更改 web.conf 文件中的根目录设置将代码发布到网站上的子目录中。不要忘记将虚拟目录设置为 ASP.NET。
父 HTML 页面 JavaScript 代码
父页面可以是网站中调用文件上传器对话框的任何 HTML 或 ASP 页面。IE 例程使用 showModalDialog
窗口打开器来显示对话框。非 IE 浏览器将使用常规的 window.open
函数。文件名将返回到父页面,以根据 web.conf 设置填充带有完整服务器路径或部分路径的文本框。
调用参数在父页面中设置,以控制覆盖提示的功能。覆盖提示可以设置为弹出消息、非弹出消息或无提示。如果设置了存档位置,则旧文件将使用日期/时间戳进行归档。
//set variables here
var btestNonIE = false; //set to false - **** for testing only *****
var sReturnForm = "edit_Content";
var sReturnField = "FileName";
var sUploadFolder = "pending";
//use only one value: [popup, message, none]
//none value will archive without prompting if Archive dir is set
var sOverwritePrompt = "popup"
// archives old file if value set (regardless of overwrite prompt)
//will also create sub dir if path is more than one level
var sArchiveFolder = "archive/december";
// end of variables to set
function Upload() {
var rValue="";
var sOptions = "status=no, resizable= no, scrollbars= no, " +
"toolbar= no,location= no, menubar= no'";
var sFormSize = "";
if (navigator.appName == "Microsoft Internet Explorer"
&& btestNonIE != true) { //btestNonIE is just for testing
//IE Browser
sOptions = "status:no; unadorned:yes; " +
"scroll:no; help:no; resizable:no; toolbar:no";
var sRequests = "?folder=" + sUploadFolder;
sRequests += "&archive=" + sArchiveFolder;
sRequests += "&overwrite=" + sOverwritePrompt;
rValue = showModalDialog('FileUploader.aspx' + sRequests +
'', 'FileUploader','dialogHeight:220px; dialogWidth:650px;' +
sOptions + '');
if (rValue != undefined) {
update_field(rValue,sReturnForm,sReturnField);
}
}else{
//Not IE Browser
var sRequests = "?folder=" + sUploadFolder;
sRequests += "&archive=" + sArchiveFolder;
sRequests += "&retForm=" + sReturnForm;
sRequests += "&retField=" + sReturnField;
sRequests += "&overwrite=" + sOverwritePrompt;
window.open('FileUploader.aspx' + sRequests +
'','FileUploader', 'height=220, width=650," +
sOptions + "');
}
}
function update_field(sNewValue,sForm,sField)
{
eval("document." + sForm + "[sField].value = sNewValue;");
}
ASP.NET 代码隐藏,用于 Web 方法 FileExists 例程
此代码由以下列出的 ASP.NET 程序的 JavaScript 调用。我们现在可以使用 System.IO
库来检查服务器上是否存在该文件。由于正在调用服务器端代码,因此不会显示浏览器安全警告消息。
<WebMethod()> _
Shared Function CheckFileExists(ByVal FileName As String) As Boolean
'use web methods to check if file exists
'called from javascript code
If (System.IO.File.Exists(FileName)) Then
Return True
Else
Return False
End If
End Function
使用 JavaScript 的 ASP.NET 默认页面代码,用于 FileExists 例程
此 JavaScript 代码位于 default.aspx 页面中。使用 AJAX Web 方法,我们现在可以从客户端代码调用服务器端代码。当用户单击文件上传按钮时,JavaScript 会调用上面的代码隐藏,并检查文件是否存在。系统会提示用户,或者警告消息会显示在文件上传器对话框中。
这可以通过使用 JavaScript 来完成,但 PC 上的浏览器安全设置必须允许 JavaScript ActiveX,而不会提示用户。Web 方法允许客户端代码在服务器上运行原生 VB.NET 代码。
有两个 Web 方法调用。一个用于弹出窗口,一个用于在标签控件中显示的警告消息。用户单击“确定”以覆盖文件并上传文件后,将提交该页面。
隐藏变量用于在 JavaScript 和代码隐藏例程之间传输数据。
function CheckFileExists(){
//use PageMethods to call code behind routine
var sOverwrite = document.frmUploadFile.hOverwrite.value;
var sDestFolder=document.frmUploadFile.hDestFolderPath.value;
var sUploadFile=document.getElementById('uploadFile').value;
var sDestFilePathName=GetDestFileName();
if (sOverwrite == "none" || sOverwrite == "" ||
sOverwrite == "message") {
//no overwrite message - just check if file exists and postback
PageMethods.CheckFileExists(sDestFilePathName,FileExistsCallBackNoMessage);
return false;
}
//prompt user with confirmation that file exists
document.getElementById("hFileExists").value="false";
if(sDestFilePathName.length == 0) {return false}
if (sOverwrite == "popup") {
//show confirm box and post back
PageMethods.CheckFileExists(sDestFilePathName,FileExistsCallBack);
}
return false;
}
function FileExistsCallBack(result){
//if file exists on server, confirm with user
if(result) {
//file exists so prompt user
if(confirm("File already exists. Do you want to overwrite?")) {
document.getElementById("hFileExists").value="true";
__doPostBack('btnSave','');
}
}
else
//file doesn't exists on server.. So upload it
__doPostBack('btnSave','');
}
function FileExistsCallBackNoMessage(result){
//if file exists on server, no confirmation message
if(result) {
document.getElementById("hFileExists").value="true";
}
__doPostBack('btnSave','');
}
function FileExistsCallBackMessage(result){
//callback from FileBrowseChangeMessage
//if file exists on server, display overwrite button only
if(result) {
var objUploadLabelMessage=document.getElementById("lblUploadMessage");
var objSaveButton=document.getElementById("btnSave");
document.getElementById("hFileExists").value="true";
EnableSaveButton();
//change save button text to overwrite and messge to overwrite values
objSaveButton.src="Images/btnOverwrite.jpg";
//hide cancel button and show overwrite button so code behind routine is used
var objButtonCancel=document.getElementById("btnCancel");
objButtonCancel.src="Images/blank.gif";
var objButtonCancelOverwrite=document.getElementById("btnCancelOverwrite");
objButtonCancelOverwrite.src="Images/btnCancel.jpg";
objUploadLabelMessage.style.forecolor="orangered";
objUploadLabelMessage.innerText="Caution! Destination File exists." +
" Click Overwrite to replace or Cancel.";
document.frmUploadFile.imgBeforeMessage.disabled=false;
document.frmUploadFile.imgBeforeMessage.src="Images/icon_caution.gif";
}
}
function GetDestFileName(){
var sDestFolder = document.frmUploadFile.hDestFolderPath.value;
var sUploadFile = document.getElementById('uploadFile').value;
var sDestFilePathName = sDestFolder + "\\" + FileNameFromPath(sUploadFile);
return sDestFilePathName;
}
结论
运行演示项目并更改设置以查看文件上传器对话框的功能。项目代码包含许多关于逻辑的注释。并非所有代码都显示在上面。这是我发现的唯一可以绕过浏览器安全消息的方法。