RSS

Monthly Archives: 九月 2011

文档库下载副本,文件名被截断

今天在TechNet上看到一个人问的问题(应该很早就有人发现这个问题了,2007应该就是这个样子),所以我估计我这个Blog里面写的也是很old的结论了。

原帖如下:sharepoint2010 从文档库下载文档副本 文件名被截断的问题

概括起来就是,当从文档库中下载副本的时候,过长的文件名被截断了(但是扩展名被保留);之前也有人发现过通过某些版本的浏览器文件另存为的时候也会这样。

这个原因是这样的:

下载副本是通过 /_layouts/download.aspx?SourceUrl=xxxx (xxxx就是你那个文件的路径)页面实现的,后台的类是Microsoft.SharePoint.ApplicationPages.Download,里面代码不多,不过篇幅所限就不全贴了,文件名是通过HttpHeader实现的,里面的核心方法AddContentDispostionHeader如下:

   1: private void AddContentDispositionHeader(string fileName)
   2: {
   3:     if ((this.Web != null) && (this.Web.Site.WebApplication.BrowserFileHandling == SPBrowserFileHandling.Strict))
   4:     {
   5:         base.Response.AppendHeader("X-Content-Type-Options", "nosniff");
   6:         base.Response.AppendHeader("X-Download-Options", "noopen");
   7:     }
   8:     base.Response.AppendHeader("Content-Disposition", "attachment;filename=\"" + SPHttpUtility.UrlEncodeFilenameForHttpHeader(fileName) + "\"");
   9: }
  10:  

可以看到,其中核心调用的方法是 SPHttpUtility.UrlEncodeFilenameForHttpHeader(str)

这个方法的实现如下:

   1: public static string UrlEncodeFilenameForHttpHeader(string fileName)
   2: {
   3:     string str = UrlEncodeForFilename(Path.GetExtension(fileName), 0x80, true);
   4:     string str2 = string.Empty;
   5:     if (str.Length < 0x80)
   6:     {
   7:         str2 = UrlEncodeForFilename(Path.GetFileNameWithoutExtension(fileName), 0x80 - str.Length, true);
   8:     }
   9:     return (str2 + str);
  10: }

我们可以看到,SharePoint把编码后文件名的总长度限制为128个字符,如果可能的话保留扩展名部分,截断超长的文件名。而Encode之后的中文类似于“%E4%B8%AD”这个样子(在UTF-8下,一个汉字用三个字节表示,前面那个表示“中”这个汉字),可以看到,一个汉字占了9个字符,因此就不难得到,如果扩展名是"“.docx”的话,那么前面的文件名长度最多只能容纳 (128 – 5) / 9 = 13.67,也就是13个汉字。

btw,实际上,在RFC中(参见:The Content-Disposition Header Field)中,规定了参数的长度不得超过78个字符,而且必须是编码的。当然,RFC只是个参考标准,每家都有自己的选择……

 

Posted by on 2011 年 09 月 30 日 in SharePoint

Leave a comment

SharePoint 2010 SP1新功能(存储标准)

首先,“存储标准”名词翻译的真是太奇怪了……英文是“Storage Metrics”,功能就是观察网站、文档库、文件夹、文档所占用的存储空间。

这个功能在2007的时候其实就有,不过因为种种原因(比如性能之类的问题)在2010里面被去掉了,在SP1的时候,经过一番改进又加了回来。

功能在网站集管理中的“存储标准”,点击进入后,可以看到如下的界面:

image

点击网站的名字、文件夹的名字可以进入网站/文件夹,看到里面的内容,一直具体到某个文件所占用的空间(这个占用空间是该文件所有版本加在一起占用的空间,而不是最新版本的大小,所以可以真实反应实际的存储容量)。此外,界面中还能够看到这些对象在父容器中所占的百分比、在网站配额中所占的百分比(我这个网站集没有设置网站配额),以及最后修改时间。

需要注意的是,这些数据不是实时更新的(07里面是实时更新的,对性能有一定的影响),而是靠一个Timer Job定期更新的,这个Timer Job叫“存储标准处理”(这翻译……),默认是5分钟运行一次,可以根据情况自行修改:

image

 

Posted by on 2011 年 09 月 13 日 in 未分类

Leave a comment

SharePoint 2010 SP1的新功能(网站回收站)

SP1已经出了有两个月多了,估计有不少人都已经安装了,SP1里面新增的两个功能估计也有不少人知道了,不过可能还有些人不知道,所以还是写一写好了。

新功能之一就是网站/网站集回收站。

在SharePoint 2007的时候,推出了回收站功能,这是一个很多ITPro都非常需要的功能(尽管以国内的项目实施经验来看,最终用户能用到回收站的可能性很少,绝大部分时候都是开发者在用,汗……)。不过07的时候,回收站仅能针对网站中的文档库、列表、文件夹、文件和列表条目,如果网站被删掉了,甚至网站集被删掉了,就没有办法了(除非恢复数据库备份,或者借助一些第三方的备份/还原产品)。

到了2010 SP1的时候,产品组终于把网站/网站集的回收站功能加入了进来。

先来看网站(SPWeb)的回收站

当我们删除一个网站的时候,页面中会提示这个网站删除后将被发送到网站集回收站中,如下图所示:

image

删除之后,进入网站集回收站,在“已从最终用户回收站删除”这个部分,可以看到被删除的网站,并可以进行还原(说实话,我个人觉得放在这个位置有点奇怪,这里是放置那些被从网站回收站里删掉的东西的地方,也就是说是一个二级回收站),如下图:

image

接下来看看网站集(SPSite)的回收站

删除网站集可以使用删除顶级网站的方式,或者在管理中心里面直接删除网站集。不论采用任何一种方式都是同样的效果,而且在删除网站集的时候,页面上似乎并没有什么提示信息说这个删除是可以被还原的。

实际上,还原一个被删除的网站集是没有UI的,只能通过PowerShell来完成。

首先,可以使用Get-SPDeletedSite得到被删除的网站集:

image

然后,可以用Restore-SPDeletedSite的方式回复网站,利用PowerShell管道的方式传递:

image

 

参考博客:SharePoint 2010 SP1 – Site Recycle Bin

 

Posted by on 2011 年 09 月 13 日 in SharePoint

Leave a comment

Tags: