Создание файла во вложенной папке в Sharepoint - PullRequest
1 голос
/ 27 марта 2012

Каков наилучший способ создания файла во вложенной папке в Sharepoint? Мой текущий метод

public string CreateSPFile(string spServerURL, string spDocumentLibraryURL, string folder, string fileName, Stream fileStream, bool overwrite)
{
    if (SPSite.Exists(new Uri(spServerURL)))
    {
        SPSite site = new SPSite(spServerURL);
        SPWeb oWebsite = site.OpenWeb();
        oWebsite.AllowUnsafeUpdates = true;
        SPFolder spFolder = oWebsite.Folders[spDocumentLibraryURL];
        if (!string.IsNullOrEmpty(folder))
        {
            spFolder.SubFolders[folder].Files.Add(fileName, fileStream, overwrite);
        }
        else
        {
            SPFileCollection files = spFolder.Files;
            spFolder.Files.Add(fileName, fileStream, overwrite);
        }
        oWebsite.AllowUnsafeUpdates = false;
        site.Close();
    }
}

Как видите, если я хочу создать файл во вложенной папке, мне нужно изменить мои коды. Какой будет лучший способ справиться с ситуацией сохранения вложенных папок?

Согласно моей структуре проекта, файл может иметь вид / DocumentLibrary / Folder1 / Folder2 / Folder3 / File.txt.

Ответы [ 2 ]

3 голосов
/ 27 марта 2012

Вы можете загрузить папку по ее URL-адресу сервера:

SPFolder folder = web.GetFolder("/DocumentLibrary/Folder1/Folder2/Folder3/");

При таком подходе вам не нужно загружать папку по папке, и ваш код работает с n уровнями папок.

Я обновил ваш пример кода и добавил несколько комментариев относительно лучших практик SharePoint:

public string CreateSPFile(string spServerURL, string spDocumenttargetUrl, string folder, string fileName, Stream fileStream, bool overwrite)
{
    // I suggest skip this pre check since it internally opens a new site object
    // If you have to silenlty ignore non-existant SPSite you should catch a FileNotFoundException.
    if (SPSite.Exists(new Uri(spServerURL)))
    {
        // use the using construct to safely dispose the opened SPSite object
        using (SPSite site = new SPSite(spServerURL))
        {
            // SPWeb object opened with SPSite.OpenWeb() have to be disposed as well
            using (SPWeb web = site.OpenWeb())
            {
                web.AllowUnsafeUpdates = true;

                string targetUrl = SPUrlUtility.CombineUrl(web.ServerRelativeUrl, spDocumenttargetUrl);

                if (!String.IsNullOrEmpty(folder))
                {
                    targetUrl = SPUrlUtility.CombineUrl(targetUrl, folder);
                }

                SPFolder target = web.GetFolder(target);

                SPFileCollection files = target.Files;
                target.Files.Add(fileName, fileStream, overwrite);

                // no need to revert AllowUnsafeUpdates for newly opened webs
                // web.AllowUnsafeUpdates = false;
            }
        }
    }
}
2 голосов
/ 11 сентября 2014

Для загрузки файла во вложенную папку вы можете рассмотреть следующий подход:

  • убедитесь, что целевая папка существует, используя метод EnsureFolder, представленный ниже
  • , загрузите файл, используя SPFileCollection.Add method

Как обеспечить существование вложенной папки с помощью SharePoint SSOM

internal static class SPWebExtensions
{
    /// <summary>
    /// Ensure SPFolder
    /// </summary>
    /// <param name="web"></param>
    /// <param name="listTitle"></param>
    /// <param name="folderUrl"></param>
    /// <returns></returns>
    public static SPFolder EnsureFolder(this SPWeb web, string listTitle, string folderUrl)
    {
        if (string.IsNullOrEmpty(folderUrl))
            throw new ArgumentNullException("folderUrl");
        var list = web.Lists.TryGetList(listTitle);
        return CreateFolderInternal(list, list.RootFolder, folderUrl);
    }


    private static SPFolder CreateFolderInternal(SPList list, SPFolder parentFolder, string folderUrl)
    {
        var folderNames = folderUrl.Split(new char[] {'/'}, StringSplitOptions.RemoveEmptyEntries);
        var folderName = folderNames[0];

        var curFolder =
            parentFolder.SubFolders.Cast<SPFolder>().FirstOrDefault( f => System.String.Compare(f.Name, folderName, System.StringComparison.OrdinalIgnoreCase) == 0);
        if (curFolder == null)
        {
            var folderItem = list.Items.Add(parentFolder.ServerRelativeUrl, SPFileSystemObjectType.Folder,
                                            folderName);
            folderItem.SystemUpdate();
            curFolder = folderItem.Folder;
        }


        if (folderNames.Length > 1)
        {
            var subFolderUrl = string.Join("/", folderNames, 1, folderNames.Length - 1);
            return CreateFolderInternal(list, curFolder, subFolderUrl);
        }
        return curFolder;
    }
}

Суть: EnsureFolder.cs


В следующем примере демонстрируется, как обеспечить наличие следующей структуры папок в библиотеке Documents и загрузить в нее файл:

Orders
     |
     A --
        |
        A1

Пример:

var targetFolder = web.EnsureFolder("Documents", "Orders3/A/A1");
var fileContent = System.IO.File.ReadAllBytes(fileName);
var fileUrl = Path.GetFileName(fileName);
targetFolder.Files.Add(fileUrl, fileContent);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...