自动将所有附件下载到SharePoint项目

本文关键字:下载 SharePoint 项目 | 更新日期: 2023-09-27 18:26:41

我有一个控制台应用程序,它最终将作为控制台应用程序运行。我需要循环浏览一个外部Sharepoint网站,找到所有新项目,看看是否有附件,如果有,我需要下载这些附件。

我能够查询List,并且能够遍历附件来填充File集合。

FolderToSaveTo解析为"''''APPDEV03''NEMStoPSIMS''"并传递if(System.IO.Directory.Exists(destPath))语句,但在下一行使用(Stream destFile=System.IO.File.OpenWrite(destPath))throws{"文件名、目录名或卷标语法不正确。''r''n"}

我可以导航到''APPDEV03''NEMStoPSIMS'',并且可以手动保存文件。

<add key="FolderToSaveTo" value="''APPDEV03'NEMStoPSIMS'" />
 SharePointConnector.FolderToSaveTo = ConfigurationManager.AppSettings["FolderToSaveTo"];
        try
        {
            ClientContext context = new ClientContext(sp_site_address);
            context.AuthenticationMode = ClientAuthenticationMode.FormsAuthentication;
            context.FormsAuthenticationLoginInfo = new
                                        FormsAuthenticationLoginInfo(username, pwd);
            List list = context.Web.Lists.GetByTitle(requests_list_name);
            CamlQuery query = new CamlQuery();
            query.ViewXml = "<View><RowLimit>100</RowLimit></View>";
            ListItemCollection items = list.GetItems(query);
            context.Load(list);
            context.Load(items);
            context.ExecuteQuery();
            foreach (ListItem oListItem in items)
            {                       
                FileCollection Files = GetAttachments(context, list, oListItem);                    
                foreach (Microsoft.SharePoint.Client.File f in Files)
                {                        
                    Download(f.ServerRelativeUrl, FolderToSaveTo, context);
                }
                lstRequests.Add(Agreement);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    public static FileCollection GetAttachments(ClientContext ctx, List list, ListItem item)
    {            
        ctx.Load(list, l => l.RootFolder.ServerRelativeUrl);
        ctx.Load(ctx.Site, s => s.Url);
        ctx.ExecuteQuery();
        Folder attFolder = ctx.Web.GetFolderByServerRelativeUrl(list.RootFolder.ServerRelativeUrl + "/Attachments/" + item.Id);
        FileCollection files = attFolder.Files;
        ctx.Load(files, fs => fs.Include(f => f.ServerRelativeUrl, f => f.Name, f => f.ServerRelativeUrl));
        ctx.ExecuteQuery();
        return files;
    }
    public static void Download(string serverFilePath, string destPath, ClientContext context)
    {
        using (FileInformation ffl = Microsoft.SharePoint.Client.File.OpenBinaryDirect(context, serverFilePath))
        {
            if (System.IO.Directory.Exists(destPath))
            {
                using (Stream destFile = System.IO.File.OpenWrite(destPath))
                {
                    byte[] buffer = new byte[8 * 1024];
                    int len;
                    while ((len = ffl.Stream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        destFile.Write(buffer, 0, len);
                    }
                }
            }
        }
    }

自动将所有附件下载到SharePoint项目

我在没有Forms Auth的情况下测试了这段代码。我将文件名作为变量传递给了您的下载函数,并完全重写了流到文件的部分,并对您的SharePoint调用进行了一些小调整。现在效果很好。

  static void Main(string[] args)
  {
      using (ClientContext context = new ClientContext(sp_site_address))
      {
            context.AuthenticationMode = ClientAuthenticationMode.FormsAuthentication;
            context.FormsAuthenticationLoginInfo = new FormsAuthenticationLoginInfo(username, pwd);
            List list = context.Web.Lists.GetByTitle(requests_list_name);
            CamlQuery query = new CamlQuery();
            query.ViewXml = "<View><RowLimit>100</RowLimit></View>";
            ListItemCollection items = list.GetItems(query);
            context.Load(items);
            context.ExecuteQuery();
            foreach (ListItem oListItem in items)
            {
                FileCollection files = GetAttachments(context, list, oListItem);
                foreach (Microsoft.SharePoint.Client.File f in files)
                {
                    Download(f.ServerRelativeUrl, FolderToSaveTo, context, f.Name);
                }
                lstRequests.Add(Agreement);
            }
        }
    }
    public static FileCollection GetAttachments(ClientContext ctx, List list, ListItem item)
    {
        ctx.Load(list, l => l.RootFolder.ServerRelativeUrl);
        ctx.Load(ctx.Site, s => s.Url);
        ctx.ExecuteQuery();
        Folder attFolder = ctx.Web.GetFolderByServerRelativeUrl(list.RootFolder.ServerRelativeUrl + "/Attachments/" + item.Id);
        FileCollection files = attFolder.Files;
        ctx.Load(files, fs => fs.Include(f => f.ServerRelativeUrl, f => f.Name, f => f.ServerRelativeUrl));
        ctx.ExecuteQuery();
        return files;
    }
    public static void Download(string serverFilePath, string destPath, ClientContext context, string filename)
    {
        using (FileInformation ffl = Microsoft.SharePoint.Client.File.OpenBinaryDirect(context, serverFilePath))
        {
            if (System.IO.Directory.Exists(destPath))
            {
                using (FileStream fileStream = System.IO.File.Create(destPath + "''" + filename))
                {
                    using (MemoryStream stream = new MemoryStream())
                    {
                        ffl.Stream.CopyTo(stream);
                        stream.WriteTo(fileStream);
                    }
                }
            }
        }
    }