Как вы получаете сведения о файле в SharePoint ItemEventReciever в событии ItemAdding?

StackOverflow https://stackoverflow.com/questions/1180364

Вопрос

Я бы ожидал, что что-то подобное сработает, но все свойства ListItem, BeforeProperties, AfterProperties равны нулю / 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?

Это было полезно?

Решение

Вы можете использовать HttpContext для извлечения HttpFileCollection, который должен содержать загруженные файлы.Это будет работать только для загрузки отдельных файлов через веб-интерфейс.Загрузка нескольких файлов или сохранение непосредственно из 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
        }
    }
}

Другие советы

Обратите внимание на суффикс -"добавление". Он будет равен нулю, потому что он еще не был добавлен.Попробуйте использовать - "добавлено".

Редактировать:Я полагаю, что где-то есть объект "AfterProperties, а не properties", который вы можете захватить, в данный момент я ухожу, но я уверен, что вы можете немного покопаться в Google, чтобы найти соответствующий метод, который выдается.

Как писала Джейни, это событие запускается перед вставкой, но вы должны иметь доступ к свойствам BeforeProperties, чтобы у вас не было события use the ItemAdded .

В большинстве случаев это было бы слишком поздно, поскольку событие ItemAdding обычно используется для проверки входных данных.

Счастливое кодирование

Можно получить имя файла с помощью свойства (есть несколько, которые вы можете использовать). SPItemEventProperties.Перед началом содержит это.

Невозможно извлечь содержимое файла, поскольку это не предоставлено ни одним участником Свойства SPItemEventProperties.Файл еще не был записан в базу данных и существует только в памяти сервера, к которому подключен пользователь.Поэтому, к сожалению, стандартные методы не могут быть использованы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top