【发布时间】:2011-09-25 14:19:45
【问题描述】:
我有一个绑定到 SharePoint 2010 图片库的事件接收器。上传图片后,我想打开它进行处理。使用 Web 界面上传的文件工作正常,但通过 Windows 资源管理器视图复制的文件返回零字节。下面是简化的代码。
public override void ItemAdded(SPItemEventProperties properties)
{
SPListItem item = properties.ListItem;
SPFile file = item.File;
byte[] buffer = file.OpenBinary(); //buffer has zero bytes for files copied in Windows Explorer!
}
如果我在打开之前插入延迟,它会起作用。
public override void ItemAdded(SPItemEventProperties properties)
{
SPListItem item = properties.ListItem;
SPFile file = item.File;
System.Threading.Thread.Sleep(2000);
byte[] buffer = file.OpenBinary(); //buffer now populated correctly
}
但我认为 ItemAdded 仅在一切完成后才被调用,包括文件上传。 我还发现 file.CanOpenFile(true) 总是返回 true,无论 OpenBinary 是否有效。
在调用 OpenBinary() 之前,如何确保文件已准备好打开? 我不喜欢 Thread.Sleep 解决方案,因为我确信更大的文件或更繁忙的服务器需要更多的等待。所需时间无法预测,我不想永远循环再试一次。
更新:我原本以为打开失败是因为文件比较大。问题已更新,以反映资源管理器的观点作为原因。我还发现 Windows 资源管理器副本也会触发 ItemUpdated(两次),我可以在此处打开文件。有 3 个触发器,2 个调用来做 1 件事有点混乱,所以我仍然愿意接受建议。
【问题讨论】:
-
为了澄清这个“非正式错误报告”,问题是 itemAdded 中的 SPFile 对象有时有 0 字节,即使它应该有 sizeof(document) 字节。我不确定 iratepr 的情况,但是如果您将 Word 文档上传到 SP 文档库,Windows 资源管理器是无关紧要的 - SPFile 是否具有正确的数据量似乎是随机的。
标签: sharepoint sharepoint-2010 event-receiver