Как загрузить (несколько) файлов в SharePoint Online с помощью CSOM?

У меня есть веб-форма, которая загружает некоторые введенные данные в список SharePoint в качестве нового элемента списка, который хорошо работает. Я попытался добавить новый код для загрузки двух файлов с помощью двух отдельных элементов управления <asp:FileUpload>. Следующий код в protected void sendToSharePoint() {} не работает для загрузки ни одного файла в указанную библиотеку документов SharePoint, не говоря уже об обоих:

По умолчанию.aspx:

//Existing code

<asp:FileUpload ID = "upldGradeReport" runat = "server" />
<asp:FileUpload ID = "upldExpenseReceipt" runat = "server" />

<asp:Button ID = "btnSubmitForm" OnClick = "SubmitButton_Click" runat = "server" Text = "Submit" />

Default.aspx.cs:

using System;
using System.DirectoryServices;
using System.IO;
using System.Security;
using System.Web.UI;
using Microsoft.SharePoint.Client;
using ClientOM = Microsoft.SharePoint.Client;

//I left out the NameSpace and default public partial class wrapper, but they're here.

public ClientContext SPClientContext { get; set; }
public string SPErrorMsg { get; set; }

protected void SubmitButton_Click(object sender, EventArgs e) {
    sendToSharePoint();
    Response.BufferOutput = true;
    Response.Redirect("Submission.aspx");
}

protected void sendToSharePoint() {

    try {
        string siteUrl = "<sharepoint site url>";

        ClientContext clientContext = new ClientContext(siteUrl);
        clientContext.Credentials = new SharePointOnlineCredentials("<my username>", "<my password>");

        string sDocName = string.Empty;
        string sDocName1 = string.Empty;
        Uri uri = new Uri(siteUrl);
        string sSPSiteRelativeURL = uri.AbsolutePath;
        sDocName = UploadFile(upldGradeReport.FileContent, upldGradeReport.FileName, sSPSiteRelativeURL, "<sharepoint document library>");
        sDocName1 = UploadFile(upldExpenseReceipt.FileContent, upldExpenseReceipt.FileName, sSPSiteRelativeURL, "<sharepoint document library>");

        //prior CSOM code to insert values into a new List Item exists here

        clientContext.ExecuteQuery();
    } catch (Exception ex) {
        String ThisError = ex.Message;
    }
}

public String UploadFile(Stream fs, string sFileName, string sSPSiteRelativeURL, string sLibraryName) {
    string sDocName = string.Empty;
    try {
        var sFileURL = String.Format("{0}/{1}/{2}", sSPSiteRelativeURL, sLibraryName, sFileName);
        ClientOM.File.SaveBinaryDirect(SPClientContext, sFileURL, fs, true);
        sDocName = sFileName;
    } catch (Exception ex) {
        sDocName = string.Empty;
        SPErrorMsg = ex.Message;
    }
    return sDocName;
}

Код, который создает новый ListItem и загружает в него остальные введенные данные формы в отдельный список SharePoint, по-прежнему работает после отправки, и я подтвердил правильность учетных данных, а используемая учетная запись имеет права на загрузку файлов в документ. Библиотека.

Что я делаю неправильно?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
1 830
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я протестировал приведенный ниже код в своей локальной среде; это работает нормально.

<div>
    <asp:FileUpload ID = "upldGradeReport" runat = "server" />
    <asp:FileUpload ID = "upldExpenseReceipt" runat = "server" />

    <asp:Button ID = "btnSubmitForm" OnClick = "SubmitButton_Click" runat = "server" Text = "Submit" />
</div>


protected void SubmitButton_Click(object sender, EventArgs e)
{
    sendToSharePoint();
    Response.BufferOutput = true;
    Response.Redirect("Submission.aspx");
}

protected void sendToSharePoint()
{

    try
    {
        string siteUrl = "https://tenant.sharepoint.com/sites/lee";

        ClientContext clientContext = new ClientContext(siteUrl);
        SecureString securePassword = new SecureString();
        foreach (char c in "password".ToCharArray()) securePassword.AppendChar(c);
        clientContext.Credentials = new SharePointOnlineCredentials("[email protected]", securePassword);                
        string sDocName = string.Empty;
        string sDocName1 = string.Empty;
        Uri uri = new Uri(siteUrl);
        string sSPSiteRelativeURL = uri.AbsolutePath;
        sDocName = UploadFile(clientContext,upldGradeReport.FileContent, upldGradeReport.FileName, sSPSiteRelativeURL, "MyDoc");
        sDocName1 = UploadFile(clientContext,upldExpenseReceipt.FileContent, upldExpenseReceipt.FileName, sSPSiteRelativeURL, "MyDoc");

        //prior CSOM code to insert values into a new List Item exists here

        //clientContext.ExecuteQuery();
    }
    catch (Exception ex)
    {
        String ThisError = ex.Message;
    }
}

public String UploadFile(ClientContext clientContext,Stream fs, string sFileName, string sSPSiteRelativeURL, string sLibraryName)
{
    string sDocName = string.Empty;
    try
    {
        var sFileURL = String.Format("{0}/{1}/{2}", sSPSiteRelativeURL, sLibraryName, sFileName);

        Microsoft.SharePoint.Client.File.SaveBinaryDirect(clientContext, sFileURL, fs, true);
        sDocName = sFileName;
    }
    catch (Exception ex)
    {
        sDocName = string.Empty;
        //SPErrorMsg = ex.Message;
    }
    return sDocName;
}

Проходя через это сейчас; Я вижу, вы добавили аргумент ClientContext к UploadFile()... можете ли вы объяснить, почему и/или дать ссылку на документацию, объясняющую это?

TylerH 10.04.2019 16:23

Хотя этот код может решить вопрос, включая объяснение того, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщения и, вероятно, приведет к большему количеству голосов. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для того, кто задает сейчас. Пожалуйста, редактировать ваш ответ, чтобы добавить пояснения и указать, какие ограничения и предположения применяются.

double-beep 10.04.2019 20:38

Просто повторно используйте ClientContext, если вы инициируете загрузку страницы формы ClientContext или другой метод, не нужно переходить к функции UploadFile.

Lee_MSFT 11.04.2019 03:03

Просто запоздалое примечание для моей собственной справки и для всех, кто случайно наткнется на этот код; Я заменил upldGradeReport.FileNameupldExpenseReceipt.FileName объединенной строкой других переменных, а также строками, заключенными в кавычки, и он загрузил в SharePoint «неизвестные типы файлов». для этого, получив расширение имени файла через .substring и .lastindexof, а затем добавив его в конец моего объединенного параметра имени файла.

TylerH 03.06.2020 23:09

Другие вопросы по теме