带有覆盖消息的ASP.NET 文件上载程序

分享于 

10分钟阅读

Web开发

  繁體

fileuploader1.GIF

fileuploader2.GIF

介绍

这里 ASP.NET 应用程序是一个文件上载器对话框,可以从经典 ASP。net调用。 它是为在内部网站点中使用而设计的。 文件上载器将覆盖警告显示为弹出窗口或者警告消息。 被覆盖的文件用附加到文件名的时间戳存档。 检查文件是否已经存在已经成为最大的障碍。 FileExists 函数使用导致浏览器安全警告的ActiveX控件。 解决方法是通过调用 AJAX Web服务 访问例程后面的代码。

背景

我需要一个文件上传对话框对我的ASP经典intranet网站,但我找不到任何符合需要的东西。 我想在覆盖现有文件之前提示用户。 另外,我希望在上传完成后显示选中的文件名。 似乎 FileUploader 控件在上传文件后清除了文件名。 我还需要为用户存档旧文件。

使用代码

只有在已经安装了AJAX时才打开项目。

这个项目需要 IE6.ASP.NET 2.0.AJAX和 JavaScript。 这个项目包含所有需要作为演示运行的文件和图像。 服务器的目录权限必须正确设置,以允许Internet来宾帐户写入目录。

变量必须在示例HTML页面和 web.conf 中设置,以满足你的需要。 确定将 testupload.htm 设置为项目的启动页。

代码可以通过更改 web.conf 文件中的root 目录设置发布到网站上的子目录中。 不要忘记将虚拟目录设置为 ASP.NET.

父HTML页JavaScript代码

父页可以是网站中调用文件上传器对话框的任何HTML或者ASP页面。 IE 例程使用 showModalDialog 窗口打开器显示对话框。 非浏览器浏览器将使用常规 window.open 函数。 根据 web.conf 设置,将文件名返回父页面以使用完整服务器路径或者部分路径填充文本框。

调用参数在父页中设置,以控制重写提示的功能。 覆盖提示可以设置为弹出,非弹出消息或者无提示。 如果存档位置设置,旧文件将用日期/时间戳存档。

//set variables herevar 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 setvar sOverwritePrompt = "popup"// archives old file if value set (regardless of overwrite prompt)//will also create sub dir if path is more than one levelvar sArchiveFolder = "archive/december";// end of variables to setfunction 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 Browservar 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;");
}

Web方法FileExists例程后面的ASP.NET 代码

这里代码由列出的below 程序的ASP.NET JavaScript调用。 现在我们可以使用 System.IO 库检查服务器上是否存在该文件。 由于调用了服务器端代码,因此不会显示浏览器安全警告消息。

<WebMethod()> _SharedFunction CheckFileExists(ByVal FileName AsString) AsBoolean'use web methods to check if file exists'called from javascript codeIf (System.IO.File.Exists(FileName)) ThenReturnTrueElseReturnFalseEndIfEndFunction

使用for例程的ASP.NET 默认页码

这里JavaScript代码位于 default.aspx 页中。 我们现在可以使用AJAX网络方法从客户端代码中调用服务器端代码。 当用户点击文件上传按钮,JavaScript调用 上面 代码后,检查文件是否存在。 将提示用户,或者在文件上载程序对话框中显示一条警告消息。

这可以通过使用JavaScript实现,但是浏览器上的浏览器安全设置必须允许 JavaScript ActiveX,而不提示用户使用浏览器。 Web方法允许客户端代码在服务器上运行本机 VB.Net 代码。

有两个Web方法调用。 一个用于弹出,另一个用于显示在标签控件中的警告消息。 用户单击确定并上载文件后,将提交该页面。

隐藏变量用于在JavaScript和例程后面的代码之间传输数据。

function CheckFileExists(){
 //use PageMethods to call code behind routinevar 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);
 returnfalse;
 }
 //prompt user with confirmation that file exists document.getElementById("hFileExists").value="false";
 if(sDestFilePathName.length == 0) {returnfalse}
 if (sOverwrite == "popup") {
 //show confirm box and post back  PageMethods.CheckFileExists(sDestFilePathName,FileExistsCallBack);
 }
 returnfalse;
}function FileExistsCallBack(result){
 //if file exists on server, confirm with userif(result) {
 //file exists so prompt userif(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 messageif(result) {
 document.getElementById("hFileExists").value="true";
 }
 __doPostBack('btnSave',''); 
}function FileExistsCallBackMessage(result){
 //callback from FileBrowseChangeMessage//if file exists on server, display overwrite button onlyif(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 usedvar 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;
}

结束语

运行演示项目并更改设置以查看文件上载器对话框的功能。 项目代码包含许多有助于逻辑的注释。 并非所有代码都显示为 上面。 这是我能找到绕过浏览器安全信息的唯一方法。


相关文章