SharePoint 2010文档库批量下载文档的实现

在SharePoint 2010文档库中,结合单选框,在Ribbon中提供了批量处理文档的功能,比如,批量删除、批量签出、批量签入等,但是,很遗憾,没有提供批量下载,如图:

若选中多个文档后,会发现Download a Copy这个Ribbon按钮变灰了,这几天,我自己做了一个Ribbon,实现了批量下载的功能,向大家介绍一下。

先来说一下我这个批量下载的原理:

1.       Ribbon按钮。在前端有一个Ribbon按钮,我也把它安置在Copies这个group里,它的作用是取得当前的文档库ID和所有被选中的条目的ID,作为参数传给下载页,下载页是一个Application Page。

2.       获取文档库中的文档。在下载页完成,根据传递来的文档库ID和item ID, 获得对应的SPDocumentLibrary和SPFile。

3.       把存放在数据库中的文档转化为实际的文档。在下载页完成,由于文档库中的文档是以二进制存放在数据库中,因此需要转化为实际的文档,为了打包方便,在服务器创建一个单独的文件夹存放,我以文档库的名字+当前的时间来作为文件夹的名称。

4.       打包下载。在下载页完成,将对应的文件夹打包成.zip包,完成下载。

要用到的技术:

1.       自定义Ribbon。请参阅我的另一篇随笔:SharePoint 2010自定义开发Ribbon

2.       Application Page。不再赘述。

3.       压缩。我使用的开源的ICSharpCode.SharpZIPLib。

开发工具还是使用Visual Studio 2010:

通过Visual Studio 2010,可以非常方便的开发自定义Ribbon和Application Page。

分别介绍一下:

1.       Ribbon。

主要来看一下这个Ribbon按钮的Command Action:

复制代码

 1 var ids='',url='';
 2 var c=ctx.dictSel;
 3 for (var key in c) 
 4 {
 5 ids=ids+c[key].id+',';
 6 }; 
 7 if(ids!='')
 8 {
 9 url=ctx.HttpRoot+'/_layouts/downloads/download.aspx?listid='+ctx.listName+';'+ids;
10 window.open(url);
11 }
12 

复制代码

 

 

其中,ctx为current context,类似于我们在后台使用SPContext,在SharePoint 2010页面中都会有这个context,它是一个ContextInfo对象,在一个页面的源文件中,可以看到

 

复制代码

<script type="text/javascript">
ctx = new ContextInfo();              
var existingHash = '';      
 if(window.location.href.indexOf("#") > -1)
{         existingHash = window.location.href.substr(window.location.href.indexOf("#"));       
}       
ctx.existingServerFilterHash = existingHash;      
 if (ctx.existingServerFilterHash.indexOf("ServerFilter=") == 1) 
{         ctx.existingServerFilterHash = ctx.existingServerFilterHash.replace(/-/g, '&').replace(/&&/g, '-');         var serverFilterRootFolder = GetUrlKeyValue("RootFolder", true,ctx.existingServerFilterHash);         var currentRootFolder = GetUrlKeyValue("RootFolder", true);        
 if("" == serverFilterRootFolder && "" != currentRootFolder)        
 {           ctx.existingServerFilterHash += "&RootFolder=" + currentRootFolder;         }         window.location.hash = '';         window.location.search = '?' + ctx.existingServerFilterHash.substr("ServerFilter=".length + 1);       }                   
 ctx.listBaseType = 1;             
 ctx.NavigateForFormsPages = false;       
ctx.listTemplate = "101";       
ctx.listName = "{E1616EE0-C898-435C-BFA8-CBC1C5D86B67}";       
ctx.view = "{FCBEAC6C-FAC6-4951-A06B-9561E7C8E8EC}";       
ctx.listUrlDir = "/Shared%20Documents";       
ctx.HttpPath = "http://TestSite:8080/_vti_bin/owssvr.dll?CS=65001";       
ctx.HttpRoot = "http://TestSite:8080";       
ctx.imagesPath = "/_layouts/images/";       ctx.PortalUrl = "";       ctx.SendToLocationName = "";       ctx.SendToLocationUrl = "";                  ctx.RecycleBinEnabled = 1;                ctx.OfficialFileName = "";       ctx.OfficialFileNames = "";       ctx.WriteSecurity = "1";       ctx.SiteTitle = "KevinTest";       ctx.ListTitle = "Shared Documents";       if (ctx.PortalUrl == "") ctx.PortalUrl = null;       ctx.displayFormUrl = "http://TestSite:8080/_layouts/listform.aspx?PageType=4&ListId={E1616EE0-C898-435C-BFA8-CBC1C5D86B67}";       ctx.editFormUrl = "http://TestSite:8080/_layouts/listform.aspx?PageType=6&ListId={E1616EE0-C898-435C-BFA8-CBC1C5D86B67}";       ctx.isWebEditorPreview = 0;       ctx.ctxId = 59;       ctx.isXslView = true;              if (g_ViewIdToViewCounterMap["{FCBEAC6C-FAC6-4951-A06B-9561E7C8E8EC}"] == null)           g_ViewIdToViewCounterMap["{FCBEAC6C-FAC6-4951-A06B-9561E7C8E8EC}"]= 59;       ctx.CurrentUserId = 1;                ctx.ContentTypesEnabled = true;              ctx59 = ctx;       g_ctxDict['ctx59'] = ctx;
</script>

复制代码

 

2.       下载页。

很好理解,直接看代码吧。

复制代码

  1 using System;
  2 using Microsoft.SharePoint;
  3 using Microsoft.SharePoint.WebControls;
  4 using System.Web;
  5 using System.IO;
  6 using System.Diagnostics;
  7 
  8 using ICSharpCode.SharpZipLib.Zip;
  9 using ICSharpCode.SharpZipLib.Core;
 10 
 11  
 12 namespace ProjectFor8080.Layouts.Downloads
 13 {
 14     public partial class Download : LayoutsPageBase
 15     {
 16         protected void Page_Load(object sender, EventArgs e)
 17         {
 18             if (!string.IsNullOrEmpty(Request.Params["listid"]))
 19             {
 20                 SPContext context = SPContext.Current;
 21 
 22                 SPWeb web = context.Web;
 23 
 24                 string folder =  @"C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\template\LAYOUTS\Downloads\Files\";
 25 
 26                 string listid = Request.Params["listid"];
 27                 string[] downloadParams=listid.Split(';');
 28                 string[] fileIds = downloadParams[1].Split(',');
 29                 
 30                 Guid listGuid=new Guid(downloadParams[0]);
 31 
 32                 SPDocumentLibrary sdl = web.Lists[listGuid] as SPDocumentLibrary;
 33 
 34                 //create the files folder under Downloads\Files
 35                 string time = DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss_fff");
 36 
 37                 string folderPath = folder + sdl.Title + time;
 38 
 39                 Directory.CreateDirectory(folderPath);
 40                 
 41                 //download the files from library
 42                 for(int i=0;i<fileIds.Length-1;i++)
 43                 {
 44                     SPFile file = sdl.GetItemById(Int32.Parse(fileIds[i])).File;
 45                     string path = folderPath+@"\"+ file.Name;
 46                     FileStream fs = new FileStream(path, FileMode.OpenOrCreate);
 47                     byte[] fileByte = file.OpenBinary();
 48                     fs.Write(fileByte, 0, fileByte.Length);
 49                     fs.Flush();
 50                     fs.Close(); 
 51 
 52                 }
 53 
 54                 //zip file
 55 
 56                 string zipName = sdl.Title+time+".zip";
 57                 string zipPath=folder+zipName;
 58                 CreateZipFile(folderPath, zipPath); 
 59                 string downloadUrl = context.Site.Url + @"/_layouts/downloads/files/" + zipName;
 60 
 61                 Response.Redirect(downloadUrl);                
 62             }
 63             else
 64                 return;
 65         }
 66         private static void CreateZipFile(string filesPath, string zipFilePath)
 67         {
 68             try
 69             {
 70                 string[] filenames = Directory.GetFiles(filesPath);
 71 
 72                 using (ZipOutputStream s = new ZipOutputStream(File.Create(zipFilePath)))
 73                 {
 74                     s.SetLevel(9); // 压缩级别 0-9
 75 
 76                     //s.Password = "123"; //Zip压缩文件密码
 77 
 78                     byte[] buffer = new byte[4096]; //缓冲区大小
 79 
 80                     foreach (string file in filenames)
 81                     {
 82                        ZipEntry entry = new ZipEntry(Path.GetFileName(file));
 83 
 84                         entry.DateTime = DateTime.Now;
 85 
 86                         s.PutNextEntry(entry);
 87 
 88                         using (FileStream fs = File.OpenRead(file))
 89                         {
 90                             int sourceBytes;
 91                             do
 92                             {
 93                                 sourceBytes = fs.Read(buffer, 0, buffer.Length);
 94                                 s.Write(buffer, 0, sourceBytes);
 95                             } while (sourceBytes > 0);
 96                         }
 97                     }
 98                     s.Finish();
 99                     s.Close();
100                 }
101             }
102             catch (Exception ex)
103             {
104                 HttpContext.Current.Response.Write(ex.Message);
105             }
106         }
107     }
108 }
109 

复制代码

 

 

 

运行效果:

 

选中文档,点击“Multiple Downloads”后,直接弹出IE的下载对话框:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode - 42. 接雨水】

42. 接雨水 难度困难3164 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 […

【LeetCode】第283场周赛题解

本场题题目不难&#xff0c;但是力求写出精简优雅的代码&#xff0c;还是有需要学习的地方的。 第一题 力扣 class Solution:def cellsInRange(self, s: str) -> List[str]:ans []a,b,c,d s[0],s[1],s[3],s[4]for i in range(ord(a), ord(c)1):for j in range(int(b),int…

Linq to Sql : 三种事务处理方式

Linq to SQL支持三种事务处理模型&#xff1a;显式本地事务、显式可分发事务、隐式事务。(from MSDN: 事务 (LINQ to SQL))。MSDN中描述得相对比较粗狂&#xff0c;下面就结合实例来对此进行阐述。 0. 测试环境 OSWindows Server 2008 Enterprise sp1IDEVisual Studio 2008, …

【LeetCode - 33】搜索旋转排序数组(二分)

力扣 解题报告&#xff1a; 二分。但是有不少细节要考虑清楚。 所以干脆考虑另一种二分的方式。也就是第二次二分的时候&#xff0c;把两半数组给拼成一个完整的数组&#xff0c;当然下标需要是虚拟的&#xff0c;这一步可以用偏移量取模完成。这样就不需要考虑边界情况了。 …

【LeetCode - 1765】. 地图中的最高点

力扣 解题报告&#xff1a; 多元BFS。 进阶一下&#xff1a; 二维数组&#xff0c;1表示等高线&#xff0c;0表示平地&#xff0c;比如 输入 010 111 010 输出 010 121 010输入 010 101 010 输出 010 111 010即输入一个二维地图&#xff0c;保证等高线一定是闭合的环&#x…

【转】微服务架构下分布式事务方案

1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务&#xff0c;这样可以降低开发难度、增强扩展性、便于敏捷开发。当前被越来越多的开发者推崇&#xff0c;很多互联网行业巨头、开源社区等都开始了微服务的讨论和实践。Hailo有160个不同服务构成…

【LeetCode - 443】压缩字符串(模拟)

解题报告&#xff1a; 直接模拟。 class Solution { public:int compress(vector<char>& chars) {int p 0;for(int i 0; i<chars.size();) {int j i1;while(j<chars.size() && chars[j] chars[i]) j;chars[p] chars[i];if(j-i > 1) {int cnt…

Linq to SQL之使用事务

事务是一个原子的工作单位&#xff0c;必须完整的完成单位里的所有工作&#xff0c;要么全部执行&#xff0c;要么全部都不执行。如果提交事务&#xff0c;则事务执行成功&#xff1b;如果回滚事务&#xff0c;则事务执行失败。 事务具备4个基本特性--ACID(原子性、一致性、孤立…

【LeetCode - 798】得分最高的最小轮调(转化法)

解题报告&#xff1a; 思路一&#xff1a;这题首先说一个nlogn的方法。 首先一个主客转化&#xff0c;题目描述是说把数组做翻转&#xff0c;idx不变&#xff0c;然后nums[i]和i作比较。那么我们可以转化为让数组不变&#xff0c;idx转变&#xff0c;即&#xff1a;假设刚开始…

【转】聊聊分布式事务,再说说解决方案

前言 最近很久没有写博客了&#xff0c;一方面是因为公司事情最近比较忙&#xff0c;另外一方面是因为在进行 CAP 的下一阶段的开发工作&#xff0c;不过目前已经告一段落了。 接下来还是开始我们今天的话题&#xff0c;说说分布式事务&#xff0c;或者说是我眼中的分布式事务…

【LeetCode - 2049】统计最高分的节点数目

解题报告&#xff1b; 直接dp。注意mx也得longlong AC代码&#xff1a; class Solution { public:vector<int> vv[200005];int sum[200005];long long ans[200005];int n;void dfs(int x) {ans[x] 1; sum[x] 1;for(int i 0; i<vv[x].size(); i) {dfs(vv[x][i]);s…

【LeetCode每日一题】2024. 考试的最大困扰度

​​​​​​力扣 解题报告&#xff1a; 因为只有T和F两个元素&#xff0c;不难证明单向性。尺取法解决。当然这题也可以二分。 AC代码&#xff1a; class Solution { public:int maxConsecutiveAnswers(string answerKey, int k) {int l 0, r 0;int T 0, F 0;int ans …

2022-08-20-网易笔试题

写在前面 题目收集来源自网络&#xff0c;前四题是开发岗的&#xff0c;后四题是算法岗的&#xff0c;因为代码无处提交&#xff0c;不一定正确&#xff0c;就不贴出来了&#xff0c;这里只写一下我的思路吧~欢迎大家一起讨论~~ 1、 思路&#xff1a;因为最大1e9&#xff0c…

TUN/TAP设备浅析(一) -- 原理浅析

TUN/TAP设备浅析 TUN设备 TUN 设备是一种虚拟网络设备&#xff0c;通过此设备&#xff0c;程序可以方便地模拟网络行为。TUN 模拟的是一个三层设备,也就是说,通过它可以处理来自网络层的数据&#xff0c;更通俗一点的说&#xff0c;通过它&#xff0c;我们可以处理 IP 数据包…

2022-08-21 星环科技-C++开发笔试

1、 思路&#xff1a;拓扑排序&#xff0c;不解释了 2、 思路&#xff1a; 本来以为他是一个图论问题&#xff0c;找最大环。 但其实对于这种情况&#xff0c;他是要输出0的&#xff0c;而不是9&#xff0c;所以他不是一个图论问题&#xff0c;他带有顺序性&#xff0c;这种可…

【算法练习题】位运算(贪心)

题目&#xff1a; 解题报告&#xff1a; 首先预备几个结论&#xff1a; 1、对于两个数a,b &#xff0c;生成a&b和a|b&#xff0c;则一定对应一个常数c&#xff0c;使得生成的两个数分别是ac和a-c。 2、对于两个数a,b&#xff0c;生成a&b和a|b的前后&#xff0c;二进…

TUN/TAP设备浅析(三) -- TUN/TAP设备的应用

上一篇文章主要讲述了TUN/TAP设备的一些原理&#xff0c;你可能会好奇&#xff0c;TUN/TAP设备究竟有什么用处呢&#xff1f;所以这篇文章&#xff0c;我想用一些实际的例子来回答这个问题。 例子源自陈硕老师的博客&#xff0c;博文中关于TUN/TAP设备的使用非常典型&#xff…

云计算底层技术-虚拟网络设备(Bridge,VLAN)

openstack底层技术-各种虚拟网络设备一(Bridge,VLAN) openstack底层技术-各种虚拟网络设备二(tun/tap,veth) Linux BridgeBridge与netfilterVLAN VLAN设备原理及配置VLAN在openstack中的应用IBM网站上有一篇高质量文章Linux 上的基础网络设备详解。本文会参考文章部分内容&…

【Codeforce-911D】逆序对

题干&#xff1a; Problem - D - Codeforces 解题报告&#xff1a; 不难发现&#xff0c;假设n的倒序排列(n,n-1,...,3,2,1)的逆序对是x&#xff0c;则对n的任意一个逆序对数为y的排列做翻转&#xff0c;新生成的排列的逆序对数位x-y。 因此这题作为奇偶性&#xff0c;其实只…

【LeetCode-面试题 17.09 - medium】第 k 个数

力扣 解题报告&#xff1a; 法一&#xff1a;优先队列做bfs。 法二&#xff1a;看成三个有序链表&#xff0c;做三路归并即可。 注意这里归并&#xff0c;如果多个指针最小值&#xff0c;那么这些指针都需要