none
Добавить файл в библиотеку и получить ИД RRS feed

  • Вопрос

  • Приветствую. Нужно добавить файл в библиотеку программно. Т.е. при нажатии на кнопку появляется окно выбора файла с локального компьютера, при нажатии ОК файл добавляется в библиотеку, затем нужно сразу в программе получить этот файл как splistitem и задать некоторые свойства. Есть способ делать через javascript REST, но везде где я искал только добавление файла и все, а как получить объект splistitem не описывается. И нужно добавлять файл не в корень библиотеки, а в определенную папку.
    29 марта 2016 г. 17:49

Ответы

Все ответы

  • Добрый день,

    какие способы для вас доступны? CSOM/REST/SSOM? Какая версия SP?

    30 марта 2016 г. 3:49
  • Добрый день

    я не загружал пока файл через REST, но при создании элемента возвращается его ID. и при сохранении файла должно что то возвращаться (ну это логично)

    что касается создание в папке, то предлагаю посмотреть на примере списка. (повторюсь, с библиотекой не работал)

    Создание элемента списка в папке используя REST


    мой блог Немного о SharePoint

    30 марта 2016 г. 8:21
    Модератор
  • Здравствуйте!
    Делал что-то похожее: SharePoint custom file uploader by JSOM & REST\oData

    Что интересно, создавая это решение я задался таким же вопросом и получил ответ здесь.


    Блог о SharePoint

    30 марта 2016 г. 8:51
  • Здравствуйте!
    Делал что-то похожее: SharePoint custom file uploader by JSOM & REST\oData

    Что интересно, создавая это решение я задался таким же вопросом и получил ответ здесь.


    Блог о SharePoint

    кстати, да, совсем забыл, у Александра решение которое похоже на ваше требование.

    мой блог Немного о SharePoint

    30 марта 2016 г. 9:07
    Модератор
  • Сделал через C#, через контрол FileUpload, вот так:

    SPSite site = SPContext.Current.Site;

                    using (SPWeb web = site.OpenWeb())
                    {
                        SPListItem currentItem = SPContext.Current.ListItem;

                        string libraryName = "MyLibrary";
                        string folderName = "NewFolder";

                        SPDocumentLibrary documentLib = web.Lists[libraryName] as SPDocumentLibrary;

                        web.AllowUnsafeUpdates = true;

                        var folder = web.GetFolder(String.Format("{0}{1}/{2}", web.Url, libraryName, folderName));
                        if (!folder.Exists)
                        {
                            web.Folders.Add(String.Format("{0}{1}/{2}", web.Url, libraryName, folderName));
                        }

                        string fileUrl = documentLib.RootFolder.SubFolders[folderName].Url + "/" + MyFileUpload.PostedFile.FileName;

                        bool isOverwriteFile = true;
                        SPFile file = web.Files.Add(fileUrl, byteArray, isOverwriteFile);

                        SPListItem item = file.Item;
                        item["Title"] = MyFileUpload.PostedFile.FileName;

                        item.Update();
                        file.Update();

                        web.AllowUnsafeUpdates = false;
                    }

    Файл добавляется, но не открывается: К сожалению не удается открыть файл из-за проблем с его содержимым.


    30 марта 2016 г. 11:20
  • Добрый день,

    В вашем коде файл не откроется, у вас не определенное содержимое файла при загрузке:

    SPFile file = web.Files.Add(fileUrl, byteArray, isOverwriteFile); 
    

    Чему равно byteArray? у вас null, поэтому файл и не открывается.

    30 марта 2016 г. 12:23
  • Вообще конечно нельзя оценить не взглянув на весь код, у вас еще код выше должен быть, покажите целиком, сразу найдем ошибку.
    30 марта 2016 г. 12:27
  • Это ascx:

    <asp:FileUpload runat="server" ID="MyFileUpload"/>
    <asp:Button runat="server" ID="MyButton" Text="Загрузить документ" OnClick="MyButton_OnClick"/>

    Это обработчик события кнопки:

    protected void MyButton_OnClick(object sender, EventArgs e)
            {
                if (!MyFileUpload.HasFile)
                    return;

                Stream fStream = MyFileUpload.PostedFile.InputStream;
                byte[] byteArray = new byte[fStream.Length];
                fStream.Read(byteArray, 0, (int)fStream.Length);
                fStream.Close();

                SPSite site = SPContext.Current.Site;

                    using (SPWeb web = site.OpenWeb())
                    {
                        SPListItem currentItem = SPContext.Current.ListItem;

                        string libraryName = "MyLibrary";
                        string folderName = "NewFolder";

                        if (currentItem != null)
                        {
                            folderName = currentItem["Title"].ToString();
                        }

                        SPDocumentLibrary documentLib = web.Lists[libraryName] as SPDocumentLibrary;

                        if (documentLib == null)
                            return;

                        web.AllowUnsafeUpdates = true;


                        var folder = web.GetFolder(String.Format("{0}{1}/{2}", web.Url, libraryName, folderName));
                        if (!folder.Exists)
                        {
                            web.Folders.Add(String.Format("{0}{1}/{2}", web.Url, libraryName, folderName));
                        }

                        string fileUrl = documentLib.RootFolder.SubFolders[folderName].Url + "/" + MyFileUpload.PostedFile.FileName;

                        bool isOverwriteFile = true;
                        SPFile file = web.Files.Add(fileUrl, byteArray, isOverwriteFile);

                        SPListItem item = file.Item;
                        item["Title"] = MyFileUpload.PostedFile.FileName;

                        item.Update();
                        file.Update();

                        web.AllowUnsafeUpdates = false;
        

        // redirect делаю потому что иначе при обновлении страницы срабатывает 
        // обработчик кнопки                   

        Page.Response.Redirect(Page.Request.Url.ToString(), true);

                    }

    30 марта 2016 г. 17:51
  • Stream fStream = MyFileUpload.PostedFile.InputStream;
    byte[] byteArray = new byte[fStream.Length];
    fStream.Read(byteArray, 0, (int)fStream.Length);
    fStream.Close();

    не знаю почему, но byteArray пустой, т.е. все элементы нулевые. Этот код я взял с msdn: 

    https://msdn.microsoft.com/en-us/library/office/ms454491(v=office.14).aspx

    В общем сделал так: byte[] byteArray = MyFileUpload.FileBytes.  И заработало.

    Если у кого то есть еще какие-то мысли, пишите, буду рад любой новой информации.

    Всем большое спасибо.


    • Изменено Apoka5555 30 марта 2016 г. 19:46
    30 марта 2016 г. 19:46