直接贴代码:
using Microsoft.SharePoint.Client;
using PnP.Framework;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Security;
using System.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace destlive.developer.server.Helpers
{
public class SharePointHelper
{
private static string siteUrl =AppSettingHelper.GetAppSetting(“SharePointClient:siteUrl”).ToString();
private static string userName = AppSettingHelper.GetAppSetting(“SharePointClient:userName”).ToString();
private static string userPassword = AppSettingHelper.GetAppSetting(“SharePointClient:userPassword”).ToString();
private static string clientId = AppSettingHelper.GetAppSetting(“SharePointClient:clientId”).ToString();
private static string clientSecret = AppSettingHelper.GetAppSetting(“SharePointClient:clientSecret”).ToString();
private static string domain = AppSettingHelper.GetAppSetting(“SharePointClient:domain”).ToString();
public static ClientContext GetClientContext()
{
var authManager = new PnP.Framework.AuthenticationManager();
var ctx = authManager.GetACSAppOnlyContext(siteUrl, clientId, clientSecret);
if (domain.Contains("chinacloudapi"))
ctx = authManager.GetACSAppOnlyContext(siteUrl, clientId, clientSecret, AzureEnvironment.China);
return ctx;
}
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true; //总是接受
}
public static Microsoft.SharePoint.Client.File SaveFile(string path, bool istemp = false,string docTitle= "tempDocument")
{
//CheckProtocol();
//ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
Microsoft.SharePoint.Client.File file = null;
using (ClientContext context = GetClientContext())
{
Web web = context.Web;
string[] files = new string[1] { path };
foreach (var localFilePath in files)
{
try
{
string _filename = Path.GetFileName(localFilePath);
if (istemp)
{
_filename = "TEMP_" + Guid.NewGuid().ToString() + System.IO.Path.GetExtension(localFilePath);
}
using (FileStream fs = new FileStream(localFilePath, FileMode.Open))
{
FileCreationInformation flciNewFile = new FileCreationInformation();
flciNewFile.ContentStream = fs;
if (istemp)
{
flciNewFile.Url = _filename;
}
flciNewFile.Overwrite = true;
Folder folder = web.Folders.GetByUrl(siteUrl + "/" +docTitle);
context.Load(folder);
context.ExecuteQuery();
folder.Files.Add(flciNewFile);
context.ExecuteQuery();
}
file = web.GetFileByUrl(siteUrl + "/" + docTitle + "/" + _filename);
context.Load(file);
context.Load(file, f => f.ServerRelativeUrl);
context.ExecuteQuery();
}
catch (Exception ex)
{
LogHelper.Error(ex);
}
}
}
return file;
}
public static Stream GetFileStream(string uniqueId)
{
using (ClientContext context = GetClientContext())
{
Web web = context.Web;
Microsoft.SharePoint.Client.File file = web.GetFileById(new Guid(uniqueId));
context.Load(file);
context.ExecuteQuery();
// 获取文件内容
ClientResult<Stream> fileContent = file.OpenBinaryStream();
context.ExecuteQuery();
Stream stream = fileContent.Value;
Thread.Sleep(3000);
int length = (int)stream.Length;
return stream;
}
return null;
}
/// <summary>
///
/// </summary>
public static void CheckProtocol()
{
SecurityProtocolType securityProtocol = ServicePointManager.SecurityProtocol;
// 检查是否设置了多个协议
if (securityProtocol != SecurityProtocolType.Ssl3 &&
securityProtocol != SecurityProtocolType.Tls &&
securityProtocol != SecurityProtocolType.Tls11 &&
securityProtocol != SecurityProtocolType.Tls12)
{
// 多个协议被设置,找到默认的一个
foreach (SecurityProtocolType protocol in Enum.GetValues(typeof(SecurityProtocolType)))
{
if ((securityProtocol & protocol) == protocol)
{
LogHelper.WriteInfo($"默认的SecurityProtocolType: {protocol}");
break;
}
}
}
else
{
// 只有一个协议被设置
LogHelper.WriteInfo($"默认的SecurityProtocolType: {securityProtocol}");
}
}
public static Stream DownFileStream(string viewPath)
{
Stream stream = null;
using (ClientContext context = GetClientContext())
{
Web web = context.Web;
var file = web.GetFileByServerRelativeUrl(viewPath);
if (file != null)
{
Microsoft.SharePoint.Client.ClientResult<Stream> mstream = file.OpenBinaryStream();
context.Load(file);
context.ExecuteQuery();
using (System.IO.FileStream localFS = System.IO.File.Open(@"D:\Sample.xlsx", FileMode.OpenOrCreate))
{
mstream.Value.CopyTo(localFS);
}
stream = mstream.Value;
}
}
return stream;
}
public static Microsoft.SharePoint.Client.File SaveFileStream(Stream stream, string fileName, string prefix = "TEMP_", string docTitle = "tempDocument")
{
//CheckProtocol();
//ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
Microsoft.SharePoint.Client.File file = null;
using (ClientContext context = GetClientContext())
{
Web web = context.Web;
string _filename = prefix + Guid.NewGuid().ToString() + Path.GetExtension(fileName); ;
try
{
FileCreationInformation flciNewFile = new FileCreationInformation();
flciNewFile.ContentStream = stream;
flciNewFile.Url = _filename;
flciNewFile.Overwrite = true;
Folder folder = web.Folders.GetByUrl(siteUrl + "/" + docTitle);
context.Load(folder);
context.ExecuteQuery();
folder.Files.Add(flciNewFile);
context.ExecuteQuery();
file = web.GetFileByUrl(siteUrl + "/" + docTitle + "/" + _filename);
context.Load(file);
context.Load(file, f => f.ServerRelativeUrl);
context.ExecuteQuery();
}
catch (Exception ex)
{
LogHelper.Error(ex);
}
}
return file;
}
}
}
包情况:
<ItemGroup>
<PackageReference Include="Azure.Identity" Version="1.16.0" />
<PackageReference Include="Microsoft.Graph" Version="5.93.0" />
<PackageReference Include="Microsoft.SharePointOnline.CSOM" Version="16.1.26413.12010" />
<PackageReference Include="PnP.Framework" Version="1.18.147-nightly" />
</ItemGroup>
配置节信息:
“SharePointClient”: {
“siteUrl”: “https://demo.sharepoint.com/sites/Development/demoSharePointDocument”, // 用于加密的密钥(应非常复杂)
“userName”: “admin@demo.onmicrosoft.com”, // 发行者
“userPassword”: “Passw0rd”,
“clientId”: “32bd9422-57ba-433b-aft6-03a7e37fg1q9”,
“clientSecret”: “etJUOFFfdgrgdergfd==”,
“domain”: “gloup” //chinacloudapi
}