Загрузить большие файлы на сервер sharepoint 2013 - PullRequest
0 голосов
/ 07 июля 2019

Я пытаюсь загрузить файлы ~ 1 ГБ в sharepoint 2013 на прем, я загрузил Microsoft.SharePoint2013.CSOM и пробовал с UploadFileSlicePerSlice , но есть нет такого метода "StartUpload" (ошибка компиляции).

1 Ответ

0 голосов
/ 07 июля 2019

я не опубликовал ответ на этот вопрос здесь сообщение ?

В той же статье, которую вы опубликовали, также упоминается метод SaveBinaryDirect, который должен работать с большими файлами и наверняка присутствует в размещенном вами наджете.

Пожалуйста, попробуйте что-то вроде:



    class Program
            {
                static void Main(string[] args)
                {
                    try
                    {
                        Console.WriteLine("start");
                        using (ClientContext context = new ClientContext("[SITECOLLECTION URL]"))
                        {
                            using (FileStream fs = new FileStream(@"[PATH TO FILE LIKE C:\test.png]", FileMode.Open))
                            {
                                Microsoft.SharePoint.Client.File.SaveBinaryDirect(context, "/[LIB NAME FROM URL LIKE 'DOCUMENTS']/" + "[FILE NAME LIKE 'test.png']", fs, true);
                            }
                        }
                        Console.WriteLine("end");
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("error -> " +  ex.Message);
                    }
                    finally
                    {
                        Console.ReadLine();
                    }
                }
            }

UPDATE

Мне только что удалось загрузить файл с объемом 470 МБ с помощью этого метода на SP2016, к которому у меня есть доступ почти весь день. Посмотри пожалуйста: enter image description here

Самое смешное, что загрузка файла заняла всего 3 минуты (на SP2016). Это очень странно, так как в течение дня (когда у меня есть доступ к SP2013) я попробовал этот метод, чтобы загрузить файл размером 200 МБ на SP2013 сегодня утром, и это заняло более 1 часа:) ... Интересно, почему такая разница. Когда я ушел, файл 0,5 Гб был еще во время загрузки. Я сообщу Тебе завтра утром, закончил ли он, и сколько времени это заняло. Я думаю, что метод в целом работает (и для SP2016 работает очень быстро), проблема в SP2013, где он очень медленный и остается очень долго в «зависании», которое вы упомянули.

Возможно, если у меня будет время, я посмотрю третий метод с методами StartUpload, ContinueUpload и FinishUpload в классе File, но я не уверен, что он поддерживается для SP CSOM 2013.

ОБНОВЛЕНИЕ 2

Я наконец-то получил некоторые результаты после многих попыток загрузки на SP2013. Что я заметил, так это то, что если мы сначала получим массив byte [], а затем используем его для получения потока файлов и используем его для метода SaveBinaryDirect (), то загрузка действительно быстрая и не зависает. Пожалуйста, для SP2013 попробуйте подход, очень похожий на тот, который я опубликовал, но вот так (обратите внимание на массив байтов и контекст. Условие HasPendingRequests, это, вероятно, не требуется, но у меня возникла небольшая ошибка, и мне пришлось ее устранить таким образом :)):



    class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    Console.WriteLine("start " + DateTime.Now.ToLongDateString() + DateTime.Now.ToLongTimeString());

                    using (ClientContext context = new ClientContext("[SITECOLLECTION URL]"))
                    {
                        context.RequestTimeout = -1;
                        Web web = context.Web;
                        if (context.HasPendingRequest)
                            context.ExecuteQuery();
                        byte[] fileBytes = System.IO.File.ReadAllBytes(@"[PATH TO FILE LIKE C:\test.png]");
                        using (var fileStream = new System.IO.MemoryStream(fileBytes))
                        {
                            Microsoft.SharePoint.Client.File.SaveBinaryDirect(context, "/[LIB NAME FROM URL LIKE 'DOCUMENTS']/" + "[FILE NAME LIKE 'test.png']", fileStream, true);
                        }
                    }

                    Console.WriteLine("end " + DateTime.Now.ToLongDateString() + DateTime.Now.ToLongTimeString());
                }
                catch (Exception ex)
                {
                    Console.WriteLine("error -> " + ex.Message);
                }
                finally
                {
                    Console.ReadLine();
                }
            }
        }

на этот раз я надеюсь, что уловка

ОБНОВЛЕНИЕ 3

Последний код, который работал (с nuget в SharePoint CSOM 2013) для загрузки файла объемом 1 ГБ в SP 2013:



    try
    {
        Console.WriteLine("start " + DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString());

        using (ClientContext context = new ClientContext("[URL]"))
        {
            context.Credentials = new NetworkCredential("[LOGIN]","[PASSWORD]","[DOMAIN]");
            context.RequestTimeout = -1;
            Web web = context.Web;
            if (context.HasPendingRequest)
                context.ExecuteQuery();

            byte[] fileBytes;
            using (var fs = new FileStream(@"D:\OneGB.rar", FileMode.Open, FileAccess.Read))
            {
                fileBytes = new byte[fs.Length];
                int bytesRead = fs.Read(fileBytes, 0, fileBytes.Length);
            }

            using (var fileStream = new System.IO.MemoryStream(fileBytes))
            {
                Microsoft.SharePoint.Client.File.SaveBinaryDirect(context, "/Shared Documents/" + "OneGB.rar", fileStream, true);
            }
        }

        Console.WriteLine("end " + DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString());
    }
    catch (Exception ex)
    {
        Console.WriteLine("error -> " + ex.Message);
    }
    finally
    {
        Console.ReadLine();
    }

Помимо этого мне пришлось:

  • увеличить максимальную загрузку файла в CA для этого веб-приложения,
  • установить на CA для этого веб-приложения «Проверка безопасности веб-страницы» на Никогда (в этой ссылке есть экран, как его настроить)
  • увеличить время ожидания на IIS

и окончательный результат:

извините за язык, но я обычно работаю в PL

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...