от
Я пытаюсь загрузить файл на сервер sharepoint 2013 из кода с помощью HttpClient или другим способом. (Я не хочу использовать dll Microsoft.SharePoint.Client), потому что есть некоторые проблемы с этой dll с большими файлами. мой код HttpClient выглядит так:
public async Task UploadAsync(string filePath)
{
    string sharePointUrl = "http://codey


  Мой вывод:


Unaouthorized
False
XML Parse error
На данный момент я хочу только загрузить простой и маленький файл без использования внешней DLL              

Пожалуйста, войдите или зарегистрируйтесь для публикации ответа на этот вопрос.

1 Ответ

0 голосов
от
возможно, требуются дополнительные заголовки в объекте HttpClient. Попробуйте возможно добавить это:

    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    client.DefaultRequestHeaders.Add("Accept", "application/json;odata=nometadata");
    client.DefaultRequestHeaders.Add("binaryStringRequestBody", "true");
    client.DefaultRequestHeaders.Add("X

Также вместо использования MultipartFormDataContent вы можете попробовать отправить ByteArray с помощью PostAsync.

Что-то более или менее подобное для вашего случая


    var endpointUrl = string.Format ("{0} / _ api / web / getfolderbyserverrelativeurl (\ '{1} \') / Files / add (url = \ '{2} \', overwrite = true)", sharePointUrl, folderUrl , fileNameNotFullPAth);

    использование (var handler = new HttpClientHandler {Credentials = new NetworkCredential ("codey", "codey123")})
    использование (var client = new HttpClient (обработчик))
    {
        ByteArrayContent content = new ByteArrayContent (new MemoryStream (System.IO.File.ReadAllBytes (filePath)). ToArray ());

        HttpResponseMessage response = await client.PostAsync (endpointUrl, content) .ConfigureAwait (false);

    }


Также ... Вы рассматривали возможность использования CSOM? может быть, это был бы лучший подход, так как вы уже используете C #.

на прем (2013 .. но есть и для всех версий) У вас есть

https://www.nuget.org/packages/Microsoft.SharePoint2013.CSOM/

и для онлайн

https://www.nuget.org/packages/Microsoft.SharePointOnline.CSOM

ОБНОВИТЬ

Я добавил этот nuget в простое консольное приложение на c # (так же, как по ссылке)


и предпочтительный код, используемый для небольших файлов размером менее 2 МБ,



    class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    Console.WriteLine("start");
                    byte[] b = System.IO.File.ReadAllBytes(@"[PATH TO FILE LIKE C:\test.png]");
                    using (ClientContext context = new ClientContext("[SITECOLLECTION URL]"))
                    {
                        List list = context.Web.Lists.GetByTitle("[LIB NAME LIKE 'DOCUMENTS']");
                        FileCreationInformation fileInfo = new FileCreationInformation();
                        fileInfo.Content = b;
                        fileInfo.Overwrite = true;

                        fileInfo.Url = "[SITECOLLECTION URL]"   "/[LIB NAME FROM URL LIKE 'DOCUMENTS']/"   "[FILE NAME LIKE 'test.png']";
                        Microsoft.SharePoint.Client.File uploadFile = list.RootFolder.Files.Add(fileInfo);

                        uploadFile.ListItemAllFields.Update();
                        context.ExecuteQuery();
                    }
                    Console.WriteLine("end");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("error 

код для более крупных файлов до 2 ГБ (для SP2013): (я проверял файл, который занимал около 100 МБ)



    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 

Пожалуйста, имейте в виду, что я только что проверил это и все работает НО на SP2016 (но nuget был для SP2013 и работал все нормально), у меня нет доступа к любому SP2013 на данный момент, чтобы проверить.

Имейте в виду, что если у вас есть активированная версия в этой библиотеке, файлы будут извлечены после загрузки, и вам нужно будет выполнить проверку в другом context.ExecuteQuery ().

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

ОБНОВИТЬ

пожалуйста, посмотрите результат этого метода на SP2016, загружая файл 470MB (3 мин)


НО я попробовал то же самое на SP2013, и результат был неудовлетворительным ... это заняло много времени, и я очень долго ждал (более 2 часов), чтобы загрузить файл размером 0,5 ГБ, и загрузка все еще не завершилась в конце.

Пожалуйста, имейте в виду, чтобы продлить загрузку Вы должны изменить:


загрузить размер файла в CA
добавить context.RequestTimeout = -1; в код CSOM
установить большее время ожидания сеанса на IIS


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