如何在ItemAdding事件中的SharePoint ItemEventReciever中获取文件详细信息?

时间:2009-07-24 21:53:57

标签: c# sharepoint validation events sharepointdocumentlibrary

我希望这样的东西可以工作,但ListItem,BeforeProperties,AfterProperties都是null / empty。 我需要文件名和文件内容。

public class MyItemEventReceiver : SPItemEventReceiver {
    public MyItemEventReceiver() {}
    public override void ItemAdding(SPItemEventProperties properties) {
        SPListItem item = properties.ListItem;
        bool fail = item.File.Name.Equals("fail.txt");
        if (fail) {
            properties.ErrorMessage = "The file failed validation";
            properties.Cancel = true;
        }
    }
}

我不能使用ItemAdded,因为它是异步的,我需要同步,我可以阻止上传并向用户显示消息。

任何建议将不胜感激。例如,是否可以覆盖Upload.aspx?

4 个答案:

答案 0 :(得分:2)

您可以使用HttpContext检索应包含上传文件的HttpFileCollection。这仅适用于通过Web UI上传单个文件。执行多个文件上载或直接从Office保存不会创建HttpContext。尝试这样的事情:

private HttpContext context;

public MyItemEventReceiver() {
    context = HttpContext.Current;
}

public override void ItemAdding(SPItemEventProperties properties) {
    HttpFileCollection collection = context.Request.Files;
    foreach (String name in collection.Keys) {
        if (collection[name].ContentLength > 0) {
            // Do what you need with collection[name].InputStream
        }
    }
}

答案 1 :(得分:0)

注意后缀 - “添加”。它将为null,因为它尚未添加。尝试使用 - “添加。”

编辑:我相信有一个“AfterProperties而不是属性对象,你可以抓住某个地方,我现在已经出门了,但我相信你可以在谷歌上做一些挖掘,找到相关的方法被抛出。

答案 2 :(得分:0)

正如Janie所写,在插入之前触发了此事件,但您应该能够访问BeforeProperties,因此您没有使用ItemAdded事件。

在大多数情况下,这会延迟,因为ItemAdding事件通常用于验证输入。

快乐编码

答案 3 :(得分:0)

可以使用属性检索文件名(您可以使用一些属性)。 SPItemEventProperties.BeforeUrl包含此内容。

无法检索文件的内容,因为SPItemEventProperties的任何成员都不提供此内容。该文件尚未写入数据库,仅存在于用户连接的服务器的内存中。因此遗憾的是,不能使用标准方法。