我希望这样的东西可以工作,但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?
答案 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的任何成员都不提供此内容。该文件尚未写入数据库,仅存在于用户连接的服务器的内存中。因此遗憾的是,不能使用标准方法。