1

我希望这样的事情可以工作,但 ListItem、BeforeProperties、AfterProperties 都是空/空的。我需要文件名和文件内容。

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

4 回答 4

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
        }
    }
}
于 2009-08-17T13:35:55.997 回答
0

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

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

于 2009-07-24T21:56:58.470 回答
0

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

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

快乐编码

于 2009-07-24T22:17:30.720 回答
0

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

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

于 2009-08-12T13:58:33.913 回答