sharepoint查阅项读取

本文介绍如何使用C#在SharePoint中获取并处理列表数据,包括单选和多选查阅项的处理,以及如何将数据转换为DataTable进行绑定。

 protected void InitData()
        {
            string siteUrl = SPContext.Current.Web.Url;
            SPSite site = new SPSite(siteUrl);
            SPWeb web = site.OpenWeb();
            DataTable table = GetCamlDataListRetTable(GetCamlDataList("EmployeeList"));
            DataTable tb = new DataTable();
            tb.Columns.Add("EmployeeName");
            tb.Columns.Add("Department");
            tb.Columns.Add("Sex");
            tb.Columns.Add("Age");
            tb.Columns.Add("ID");

            foreach (DataRow item in table.Rows)
            {
                SPFieldLookupValue fieldLookup = new SPFieldLookupValue(item["部门"].ToString());
                string test = fieldLookup.LookupValue;//查阅项值
                tb.Rows.Add(item["用户名"].ToString(), test, item["性别"].ToString(), item["年龄"].ToString(), item["ID"].ToString());

            }
            gridview.DataSource = tb;
            gridview.DataBind();
        }

///当查阅项是多选时

                    SPFieldLookupValueCollection spflvCollection = new SPFieldLookupValueCollection(sq["参会人员"].ToString());
                    List<string> persons = new List<string>();
                    List<string> jiluperson = new List<string>();
                    #region 参会人员判断
                    foreach (SPFieldLookupValue lookValue in spflvCollection)
                    {
                        if (!persons.Contains(lookValue.LookupValue))
                        {
                            persons.Add(lookValue.LookupValue);
                        }
                        txt_Person.Text += lookValue.LookupValue + ";";
                    }
                    #endregion

/// <summary>
        /// 返回查询列表所有数据
        /// </summary>
        /// <param name="listName">列表名称</param>
        /// <returns></returns>
        public SPListItemCollection GetCamlDataList(string listName)
        {
            SPList list = SPContext.Current.Web.Lists[listName];
            SPQuery query = new SPQuery();
            StringBuilder sb = new StringBuilder();
            sb.Append("   <OrderBy>");
            sb.Append("     <FieldRef Name=" + listName + " />");//列名称
            sb.Append("   </OrderBy>");
            query.Query = sb.ToString();
            SPListItemCollection spic = list.GetItems(query);
            return spic;
        }

        /// <summary>
        /// 根据Caml查询返回数据表
        /// </summary>
        /// <param name="spic">Caml结果集</param>
        /// <returns></returns>
        public DataTable GetCamlDataListRetTable(SPListItemCollection spic)
        {
            DataTable dt = new DataTable();
            for (int i = 0; i < spic.List.ContentTypes[0].Fields.Count; i++)
            {
                if (dt.Columns == null || dt.Columns.Count < 1)
                    dt.Columns.Add(spic.List.ContentTypes[0].Fields[i].Title);
                else
                {
                    bool dtColumns = true;
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        if (dt.Columns[j].ColumnName == spic.List.ContentTypes[0].Fields[i].Title)
                        {
                            dtColumns = false;
                        }
                    }
                    if (dtColumns)
                    {
                        dt.Columns.Add(spic.List.ContentTypes[0].Fields[i].Title);
                    }
                }
            }
            dt.Columns.Add("ID");
            if (spic.List.ItemCount > 0)
            {
                for (int i = 0; i < spic.Count; i++)
                {
                    DataRow dr = dt.NewRow();
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        dr[dt.Columns[j].ColumnName] = Convert.ToString(spic[i][spic[i].Fields[dt.Columns[j].ColumnName.ToString()].InternalName]);
                    }
                    dt.Rows.Add(dr);
                }
            }
            return dt;
        }

 <ContentTypes>
      <ContentType ID="0x0100c2917396131641a896d310050623ef03" Name="Demo - Employee" Group="自定义内容类型" Description="我的内容类型" Inherits="TRUE" Version="0">
        <FieldRefs>
          <FieldRef ID="{0A27A629-CB34-4B6D-A68F-9873EAC77CA5}" Name="EmployeeName" />
          <FieldRef ID="{13E113B0-4E72-4E61-99FB-3E66C671D636}" Name="Sex" />
          <FieldRef ID="{A7F0556E-FCBF-4698-AC6B-EBE6E91C5CE5}" Name="Age" />
          <FieldRef ID="{250E89A0-73D4-44C8-8310-4E152BA848A8}" Name="Department" />
        </FieldRefs>
        <XmlDocuments>
          <XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url">
            <FormUrls xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url">
              <New>_layouts/Demo/EmployeeAdd.aspx</New>
            </FormUrls>
          </XmlDocument>
        </XmlDocuments>
      </ContentType>
    </ContentTypes>
    <Fields>
      <Field ID="{0a27a629-cb34-4b6d-a68f-9873eac77ca5}" Name="EmployeeName" DisplayName="用户名" Type="Text" SourceID="http://schemas.microsoft.com/sharepoint/v3" Required="TRUE" StaticName="EmployeeName" />
      <Field ID="{13e113b0-4e72-4e61-99fb-3e66c671d636}" Name="Sex" DisplayName="性别" Type="Text" SourceID="http://schemas.microsoft.com/sharepoint/v3" Required="TRUE" StaticName="Sex" />
      <Field ID="{a7f0556e-fcbf-4698-ac6b-ebe6e91c5ce5}" Name="Age" DisplayName="年龄" Type="Text" SourceID="http://schemas.microsoft.com/sharepoint/v3" Required="TRUE" StaticName="Age" />
      <Field ID="{250e89a0-73d4-44c8-8310-4e152ba848a8}" Name="Department" DisplayName="部门" List="Lists/DepartmentList" ShowField="Title" Type="Lookup" SourceID="http://schemas.microsoft.com/sharepoint/v3" Required="TRUE" StaticName="Department"  EnforceUniqueValues="FALSE" RelationshipDeleteBehavior="None" />
    </Fields>  //ShowField="Title"

转载于:https://www.cnblogs.com/GreenGrass/archive/2013/05/06/3062675.html

<think>嗯,用户现在问的是如何在.NET Core下使用Microsoft.SharePoint.Client实现SharePoint文件的上传和下载。我需要先回顾一下之前的对话历史。用户之前问过上传下载是否需要账号密码,我介绍了不同的认证方式,包括OAuth 2.0和SAS等。现在用户可能已经在实际目中遇到具体的技术实现问题,需要具体的代码示例和步骤。 首先,我需要确认用户的使用场景。他们可能是在开发一个需要与SharePoint集成的.NET Core应用程序,比如自动化文件处理、数据同步或者企业内部的文件管理系统。用户可能已经知道SharePoint的基本概念,但需要具体的实现指导,特别是在认证和文件操作方面。 之前的回答中提到了OAuth 2.0和客户端密钥认证,所以现在需要详细说明如何在.NET Core中配置这些认证方式。用户可能对如何获取Client ID、Client Secret以及Tenant ID不太清楚,需要给出具体的步骤,比如在Azure应用注册的部分。此外,可能需要指出如何正确安装必要的NuGet包,比如Microsoft.SharePointOnline.CSOM,以及如何处理不同版本的兼容性问题,因为.NET Core和传统的.NET Framework在CSOM的使用上可能有所不同。 接下来,上传和下载的具体代码示例是关键。用户需要看到清晰的代码结构,包括认证、文件上传和下载的步骤。可能需要强调使用ClientContext,以及如何正确设置凭据,比如SharePointOnlineCredentials或使用Client ID和Secret的方式。同时,需要注意.NET Core中可能不支持某些传统的方法,比如Web请求的认证方式,可能需要使用HttpClient或者调整认证流程。 另外,用户可能遇到的一些常见问题,比如权限不足、路径错误或者认证失败,需要给出排查建议。例如,检查权限范围是否正确,确认站点URL的格式,或者处理SSL/TLS证书问题。可能还需要提到如何处理大文件的上传,比如分块上传,或者使用流式处理来避免内存问题。 同时,需要提醒用户安全方面的注意事,比如不要硬编码敏感信息,推荐使用Azure Key Vault等工具管理密钥。此外,可能还需要比较不同认证方式的优缺点,帮助用户根据实际需求选择最合适的方法,比如使用客户端密钥认证适合服务端应用,而交互式登录适合需要用户登录的场景。 最后,总结步骤,确保用户能够按照清晰的流程操作,从安装包到认证配置,再到具体的上传下载实现。可能还需要提供参考链接,如Microsoft的官方文档,方便用户进一步查阅。</think>以下是使用 `Microsoft.SharePoint.Client` 在 **.NET Core** 中实现 SharePoint 文件上传和下载的详细步骤,包含代码示例和安全实践建议: --- ### **1. 准备工作** #### **(1) 安装 NuGet 包** ```bash dotnet add package Microsoft.SharePointOnline.CSOM dotnet add package Microsoft.Identity.Client # 用于 OAuth 认证 ``` #### **(2) 认证信息配置** - **Azure 应用注册**(推荐方式): - 在 Azure Portal 注册应用,获取 `ClientId`、`ClientSecret` 和 `TenantId`。 - 为应用添加 `Sites.ReadWrite.All` 权限(需管理员同意)。 - **传统账号密码**(不推荐,仅用于测试): - 准备 SharePoint 管理员账号和密码。 --- ### **2. 认证方式** #### **(1) 使用 OAuth 2.0 客户端密钥认证(推荐)** ```csharp using Microsoft.Identity.Client; using Microsoft.SharePoint.Client; var clientId = "your-client-id"; var clientSecret = "your-client-secret"; var tenantId = "your-tenant-id"; var siteUrl = "https://{tenant}.sharepoint.com/sites/{site-name}"; // 获取访问令牌 var app = ConfidentialClientApplicationBuilder .Create(clientId) .WithClientSecret(clientSecret) .WithAuthority($"https://login.microsoftonline.com/{tenantId}") .Build(); var scopes = new[] { "https://{tenant}.sharepoint.com/.default" }; var authResult = await app.AcquireTokenForClient(scopes).ExecuteAsync(); // 创建 SharePoint 客户端上下文 var ctx = new ClientContext(siteUrl); ctx.ExecutingWebRequest += (sender, e) => { e.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer " + authResult.AccessToken; }; ``` #### **(2) 使用账号密码(仅测试环境)** ```csharp var username = "user@tenant.onmicrosoft.com"; var password = "password"; var siteUrl = "https://{tenant}.sharepoint.com/sites/{site-name}"; var securePassword = new SecureString(); foreach (char c in password) securePassword.AppendChar(c); var credentials = new SharePointOnlineCredentials(username, securePassword); var ctx = new ClientContext(siteUrl); ctx.Credentials = credentials; ``` --- ### **3. 文件上传** #### **(1) 上传本地文件到 SharePoint** ```csharp var localFilePath = @"C:\Files\example.txt"; var sharePointFolderUrl = "/sites/site-name/Shared Documents/Uploads"; using (var fileStream = new FileStream(localFilePath, FileMode.Open)) { var fileName = Path.GetFileName(localFilePath); var fileUrl = $"{sharePointFolderUrl}/{fileName}"; Microsoft.SharePoint.Client.File.SaveBinaryDirect( ctx, fileUrl, fileStream, overwrite: true ); ctx.ExecuteQuery(); // 提交操作 } ``` #### **(2) 上传内存流或字节数组** ```csharp byte[] fileBytes = Encoding.UTF8.GetBytes("Hello, SharePoint!"); using (var memoryStream = new MemoryStream(fileBytes)) { Microsoft.SharePoint.Client.File.SaveBinaryDirect( ctx, "/sites/site-name/Shared Documents/test.txt", memoryStream, overwrite: true ); } ``` --- ### **4. 文件下载** #### **(1) 下载到本地文件** ```csharp var remoteFileUrl = "/sites/site-name/Shared Documents/example.txt"; var localSavePath = @"C:\Downloads\example.txt"; var file = ctx.Web.GetFileByServerRelativeUrl(remoteFileUrl); ctx.Load(file); ctx.ExecuteQuery(); var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(ctx, file.ServerRelativeUrl); using (var fileStream = new FileStream(localSavePath, FileMode.Create)) { fileInfo.Stream.CopyTo(fileStream); } ``` #### **(2) 读取为字节数组** ```csharp var file = ctx.Web.GetFileByServerRelativeUrl(remoteFileUrl); ctx.Load(file); ctx.ExecuteQuery(); var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(ctx, file.ServerRelativeUrl); using (var memoryStream = new MemoryStream()) { fileInfo.Stream.CopyTo(memoryStream); byte[] bytes = memoryStream.ToArray(); string text = Encoding.UTF8.GetString(bytes); // 文本文件示例 } ``` --- ### **5. 安全实践建议** 1. **避免硬编码密钥**: 将 `ClientId`、`ClientSecret` 等敏感信息存储在 **Azure Key Vault** 或环境变量中。 2. **最小权限原则**: 为应用分配 `Sites.ReadWrite.All` 而非更高权限。 3. **错误处理**: 添加 `try-catch` 捕获 `ServerException` 和 `UnauthorizedAccessException`。 4. **大文件处理**: 使用分块上传(如 `StartUpload`、`ContinueUpload`、`FinishUpload`)优化性能。 --- ### **6. 常见问题排查** | **问题** | **解决方案** | |---------------------------|-----------------------------------------------------------------------------| | 认证失败 (401) | 检查令牌权限范围 (`scopes`) 和 Azure 应用注册的 API 权限配置 | | 文件路径错误 (404) | 使用 `ServerRelativeUrl`(如 `/sites/site-name/Shared Documents/example.txt`)| | 内存泄漏 | 确保 `ClientContext` 和流对象在使用后正确释放(`using` 语句) | | 超时问题 | 增加 `ctx.RequestTimeout = -1;` 或分块处理大文件 | --- ### **7. 扩展功能** - **文件夹操作**: ```csharp var folder = ctx.Web.GetFolderByServerRelativeUrl("/sites/site-name/Shared Documents/SubFolder"); ctx.Load(folder); ctx.ExecuteQuery(); ``` - **元数据修改**: ```csharp var file = ctx.Web.GetFileByServerRelativeUrl(fileUrl); file.ListItemAllFields["Title"] = "New Title"; file.ListItemAllFields.Update(); ctx.ExecuteQuery(); ``` --- 通过上述步骤,可在 .NET Core 中安全高效地实现 SharePoint 文件的上传和下载。建议优先使用 OAuth 2.0 认证以符合现代安全标准。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值