я не опубликовал ответ на этот вопрос здесь
сообщение ?
В той же статье, которую вы опубликовали, также упоминается метод 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, к которому у меня есть доступ почти весь день. Посмотри пожалуйста:
Самое смешное, что загрузка файла заняла всего 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