У меня есть веб-форма, которая загружает некоторые введенные данные в список 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, по-прежнему работает после отправки, и я подтвердил правильность учетных данных, а используемая учетная запись имеет права на загрузку файлов в документ. Библиотека.
Что я делаю неправильно?
Я протестировал приведенный ниже код в своей локальной среде; это работает нормально.
<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, если вы инициируете загрузку страницы формы ClientContext или другой метод, не нужно переходить к функции UploadFile.
Просто запоздалое примечание для моей собственной справки и для всех, кто случайно наткнется на этот код; Я заменил upldGradeReport.FileName
(и upldExpenseReceipt.FileName
объединенной строкой других переменных, а также строками, заключенными в кавычки, и он загрузил в SharePoint «неизвестные типы файлов». для этого, получив расширение имени файла через .substring
и .lastindexof
, а затем добавив его в конец моего объединенного параметра имени файла.
Проходя через это сейчас; Я вижу, вы добавили аргумент
ClientContext
кUploadFile()
... можете ли вы объяснить, почему и/или дать ссылку на документацию, объясняющую это?