当上传图片时,SharePoint将自动生成缩略图(当然图片格式是有要求的,但这里先忽略掉)。而当我们自己写应用时想引用这些缩略图时,想用对象模型得到缩略图的链接,找半天也没找到。近日,公司举行摄影作品展正是利用了图片库收集作品,然后做个投票的应用页时,正是使用缩略图的场景。没办法之下,只有通过直接引用缩略图链接地址的方式解决。
缩略图规则探索:
- 通过使用图片库的过程可得知,当图片上传时会自动生成两种缩略图,一个是小图,图片库默认视图上用的,另一个是大图,查看图片库项目明细时用的。
- 链接的规则是这样:http://站点url/子站点名称/列表名称/_t/xxx_JPG.jpg
- _t便是所有小图的路径,大图是_w
- xxx_JPG是原图的文件名,把"."换成"_"了,然后后缀是.jpg
知道上边规则后便着手编码把得到缩略图的链接,请看下边代码:
代码
/// <summary>
/// 标题图片大小
/// </summary>
public enum TitileImageSize
{
Small,
Big
}
/// <summary>
/// 图片帮助类
/// </summary>
public static class ImageHelper
{
/// <summary>
/// 获取图片缩略图URL
/// </summary>
/// <param name="webUrl">站点路径(如:SPContext.Current.Site.Url)</param>
/// <param name="sourceImageUrl">源图路径(相对站点的路径,如:"xxx/xxx.jpg")</param>
/// <returns>缩略图URL</returns>
public static string GetTitleImageUrl(string webUrl, string sourceImageUrl,TitileImageSize size)
{
string result = string.Empty;
string temp = string.Empty;
//将最后一个"/"替换为"/_t/",替换的逻辑在ReplaceLastGang方法中实现
//没有这步的话,当图片库在子级站点中的时将会出飞机
Regex myRegex = new Regex("/");
MatchEvaluator myMatchEvaluator = new MatchEvaluator(ReplaceLastGang);
temp=myRegex.Replace(sourceImageUrl, myMatchEvaluator);
temp = temp.Replace(".", "_");
/// 标题图片大小
/// </summary>
public enum TitileImageSize
{
Small,
Big
}
/// <summary>
/// 图片帮助类
/// </summary>
public static class ImageHelper
{
/// <summary>
/// 获取图片缩略图URL
/// </summary>
/// <param name="webUrl">站点路径(如:SPContext.Current.Site.Url)</param>
/// <param name="sourceImageUrl">源图路径(相对站点的路径,如:"xxx/xxx.jpg")</param>
/// <returns>缩略图URL</returns>
public static string GetTitleImageUrl(string webUrl, string sourceImageUrl,TitileImageSize size)
{
string result = string.Empty;
string temp = string.Empty;
//将最后一个"/"替换为"/_t/",替换的逻辑在ReplaceLastGang方法中实现
//没有这步的话,当图片库在子级站点中的时将会出飞机
Regex myRegex = new Regex("/");
MatchEvaluator myMatchEvaluator = new MatchEvaluator(ReplaceLastGang);
temp=myRegex.Replace(sourceImageUrl, myMatchEvaluator);
temp = temp.Replace(".", "_");
switch (size)
{
case TitileImageSize.Small:
//temp = "/_t/";
break;
case TitileImageSize.Big:
temp = temp.Replace("/_t/", "/_w/");
break;
default:
break;
}
result = String.Format(@"{0}/{1}.jpg", webUrl, temp);
return result;
}
private static string ReplaceLastGang(Match m)
{
if (m.NextMatch().Index==0)
{
return "/_t/";
}
else
{
return m.Value;
}
}
{
case TitileImageSize.Small:
//temp = "/_t/";
break;
case TitileImageSize.Big:
temp = temp.Replace("/_t/", "/_w/");
break;
default:
break;
}
result = String.Format(@"{0}/{1}.jpg", webUrl, temp);
return result;
}
private static string ReplaceLastGang(Match m)
{
if (m.NextMatch().Index==0)
{
return "/_t/";
}
else
{
return m.Value;
}
}
此代码已经是第二版,第一版时关键代码只有一行
result = String.Format(@"{0}/{1}.jpg", webUrl, sourceImageUrl.Replace(".", "_").Replace("/", sizeText));//sizeText是_t或者_w
但这样写发现当图片不是在根网站上,而是在二级或者三级子网站里面的话就会有问题了,后来便使用正则找到最后一个/然后才给替换解决了。
如果哪位兄弟姐妹有更好的方法或者知道对象模型本来就有哪个成员可以得到,请来http://ryu666.cnblogs.com/留言告之,万分感谢.
最后,送上投票页面的截图,处理过的,仅供欣赏,呵呵