各位专家高手:在下求教一个SharePoint文档上传用户配额管理的解决方案:要求能够对文档库,文件夹,为单个用户或者组设置使用配额。请问有什么好的经验和方法? 还有个细节,我目前的预想方案是维护一个对应人和文件夹或文档库的配额映射表,然后自己实现个SPItemEventReceiver,在ItemAdding方法里做判断,可是我在这个方法里得不到当前请求中用户上传文件的信息,请问有没有办法?代码如下:
/// <summary> /// 列表项事件 /// </summary> public class DocumentUploadEventReceiver : SPItemEventReceiver { /// <summary> /// 正在添加项. /// </summary> public override void ItemAdding(SPItemEventProperties properties) { base.ItemAdding(properties); //TODO:获取用户当前请求中上传或更新的文件的大小,然后根据用户和目 //标文件夹的信息去配额映射表查询对应配额,如果上传+历史累计上传超额 //阻止操作 //SPFile file = properties.ListItem.File; //long length = file.Length; //properties.ListItem 是NULL; //int length = HttpContext.Current.Request.File[0].ContentLength; //HttpContext.Current 是NULL string fileSizeName = properties.List.Fields["文件大小"].InternalName; object value = properties.AfterProperties[fileSizeName]; //value 是NULL //if (超额)// //{ //properties.Status = SPEventReceiverStatus.CancelWithError; //properties.ErrorMessage = "抱歉您上传的内容已超过个人使用配额!"; //properties.Cancel = true; //} } }
找到一种不太理想的办法:在自定义的EventReceiver构造函数里HttpContext.Current是有值的,可以先把它保存起来,供ItemAdding方法里的代码使用。
如果要在ItemAdded里使用,需要在Elements.xml里,给Receiver加<Synchronization>Synchronous</Synchronization>。
获取到了HttpContext.Current,再访问HttpContext.Current.Request.File[0].ContentLength,就是上传文件的大小了。
但是这里的ContentLength是上传前的文件大小,和上传后显示的文件大小可能不同。
而且这种方法只在单个文档上传时好用,批量上传时,构造函数里也得不到HttpContext.Current!
在ItemAdding方法里获取文件大小:
string filesize = properties.AfterProperties["vti_filesize"].ToString();
参考:http://www.synergyonline.com/Blog/Lists/Posts/Post.aspx?ID=122