BS文件夹上传操作(一)

如果有一个需求,要求你在BS上实现文件夹上传操作功能?你该如何实现?

  ActiveX?Js插件?自定义控件 还是…… 

 

下面说说我们的实验

 

实验一 想到了WinForm 中的文件夹上传

    在WebForm中引用WinForm->“using System.Windows.Forms;” 这里要涉及线程操作

      [DirectMethod]
public void TopBarClick(string strOpearate)
{
btnUpdateEmInfos(strOpearate);
}
protected void btnUpdateEmInfos(string strOperate)
{
if (strOperate == "导入")
{

Thread s = new Thread(new ThreadStart(FoldDialog));
//s.ApartmentState=ApartmentState.STA;
//COM提供的线程模型共有三种:Single-Threaded Apartment(STA 单线程套间)、Multithreaded Apartment(MTA 多线程套间)和Neutral Apartment/Thread Neutral Apartment/Neutral Threaded Apartment(NA/TNA/NTA 中立线程套间,由COM+提供)。


s.SetApartmentState(System.Threading.ApartmentState.STA);
s.Start();


}
}

/// <summary>
/// 文件夹弹出框
/// </summary>
private void FoldDialog()
{
FolderDialog d = new FolderDialog();
string path = string.Empty;
if (d.ShowDialog() == DialogResult.OK)
{
path = d.Path;
}
}

 

 

FolderBrowserFolder

namespace CRM_BS.WebUI.Common
{
public class FolderDialog : FolderNameEditor
{
FolderNameEditor.FolderBrowser fDialog = new System.Windows.Forms.Design.FolderNameEditor.FolderBrowser { StartLocation = System.Windows.Forms.Design.FolderNameEditor.FolderBrowserFolder.Desktop };//逻辑桌面
/// <summary>
/// 显示文件夹浏览器对话框
/// </summary>
/// <returns></returns>
public DialogResult ShowDialog()
{
fDialog.Description = "请选择文件夹" ;
return fDialog.ShowDialog();
}
/// <summary>
/// 获取或设置文件夹上方显示的说明
/// </summary>
/// <param name="description">文件夹上方说明</param>
/// <returns></returns>
public DialogResult ShowDialog(string description)
{
fDialog.Description = description;
return fDialog.ShowDialog();
}
/// <summary>
/// 文件夹目标路径
/// </summary>
public string Path
{
get
{
return fDialog.DirectoryPath;
}
}
~FolderDialog()
{
fDialog.Dispose();
}
}
}


 

但是效果却如下:

 

 

弹出框不是激活状态

 

单击弹出框 效果

 

 

要的就是这效果,但是功能上有缺陷……实验一宣告失败(如果你这样成功了还请告知……)

 

实验二 BS要这效果? 那JS应该可以 ,下手……

先看效果:

 

看上去,好像是满足了需求

 

通过方法,还能顺利取出路径

 

再看代码

 

JS代码:

  <%--导入--%>

<script language="javascript" type="text/javascript">
function BrowseFolder() {
try {
var Shell = new ActiveXObject("Shell.Application");
var Folder = Shell.BrowseForFolder(0, "请选择文件夹", 0); //起始目录为:桌面
if (Folder != null) {
Folder = Folder.items(); // 返回 FolderItems 对象
Folder = Folder.item(); // 返回 Folderitem 对象
Folder = Folder.Path; // 返回路径
if (Folder.charAt(Folder.length - 1) != "\\") {
Folder = Folder + "\\";
}
//document.all.savePath.value = Folder;
//document.getElementById(savePath).value = Folder;
//hdPath.setValue(Folder);
//alert(document.all.savePath.value);
Ext.net.DirectMethods.GetPath(Folder);
//return Folder;
}
} catch (e) {
alert(e.message);
}
}

</script>

后台代码:

//导入
(X.GetCtl("btnTopBarArrowDown") as Ext.Net.Button).Listeners.Click.Handler = "BrowseFolder();";


/// <summary>
/// 导入->确定 方法
/// </summary>
/// <param name="path"></param>
[DirectMethod]
public void GetPath(string path)
{
CommonMethod.Show("", path, Ext.Net.MessageBox.Icon.INFO);
}


虽然表面上看“功能实现,代码也简洁,可以说是很成功” 但却牺牲了IE的安全性,需要进行一些设置。

步骤如图

一、

 

二、

 

 

再看看ActiveX 百科解释

  “ActiveX 是一个开放的集成平台,为开发人员、 用户和 Web生产商提供了一个快速而简便的在 Internet 和 Intranet 创建程序集成和内容的方法。 使用 ActiveX, 可轻松方便的在 Web页中插入 多媒体效果、 交互式对象、以及复杂程序,创建用户体验相当的高质量多媒体 CD-ROM

所以可想而知,如果为了实现这个功能我们把ActiveX状态都设置成“启用”的后果是什么了……

 

语文上经常用到“前后呼应”,那么回归到之初的问题

                  

  “如果有一个需求,要求你在BS上实现文件夹上传操作功能?你该如何实现?

 


 

 

 

  

  今天是个大好日子,祝愿园子里面的朋友:有情人的终成眷属 ,没情人的早日找到心中的情人再终成眷属!

 

 

 

 

 

 

 


作者:PEPE
出处:http://pepe.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

posted @ 2012-02-14 09:40  PEPE YU  阅读(2573)  评论(16编辑  收藏  举报