上传文件到 Sharepoint 的文档库中和下载 Sharepoint 的文档库的文件到客户端
文件操作应用场景:
如果你的.NET项目是运行在SharePoint服务器上的,你可以直接使用SharePoint服务器端对象模型,用SPFileCollection.Add方法
http://msdn.microsoft.com/zh-cn/library/ms454491%28office.12%29.aspx
如果不在同一台机器上,并且你的SharePoint是2010,你可以使用.NET客户端对象模型,用FileCollection.Add方法
http://msdn.microsoft.com/zh-cn/library/microsoft.sharepoint.client.filecollection.add(en-us).aspx
如果是SharePoint 2007,你可以用SharePoint Web Service里面的copy.asmx
http://msdn.microsoft.com/zh-cn/library/copy.copy_members%28en-us,office.12%29.aspx
============帮助文档说明===========
Create Author: Kenmu
Create Date: 2014-05-22
Function: 支持上传文件到Sharepoint的文档库中;下载Sharepoint的文档库的文件到客户端
Support three ways as following:
1)通过调用SharePoint的Copy.asmx服务实现;只适用于SharePoint站点
IFileOperation fileOperation = new SPServiceOperation();
bool isSuccess = fileOperation.UploadFileToSPSite(domain, userAccount, pwd, documentLibraryUrl, localFilePath, ref statusInfo);
bool isSuccess = fileOperation.DownloadFileFromSPSite(domain, userAccount, pwd, documentUrl, downloadToLocalFilePath, ref statusInfo);
2)通过WebClient实现;适用于普通站点
IFileOperation fileOperation = new WebClientOperation();
3)通过WebRequest实现;适用于普通站点
IFileOperation fileOperation = new WebRequestOperation();
关键代码:
IFileOperation.cs
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace FileOperationAboutSharePoint.FileOperation 7 { 8 interface IFileOperation 9 { 10 bool UploadFileToSPSite(string domain, string userAccount, string pwd, string documentLibraryUrl, string localFilePath,ref string statusInfo); 11 bool DownloadFileFromSPSite(string domain, string userAccount, string pwd, string documentUrl, string localFilePath, ref string statusInfo); 12 } 13 }
SPServiceOperation.cs
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.IO; 6 using System.Net; 7 using FileOperationAboutSharePoint.SPCopyService; 8 9 namespace FileOperationAboutSharePoint.FileOperation 10 { 11 public class SPServiceOperation : IFileOperation 12 { 13 public bool UploadFileToSPSite(string domain, string userAccount, string pwd, string documentLibraryUrl, string localFilePath, ref string statusInfo) 14 { 15 bool isSuccess = false; 16 try 17 { 18 string fileName = Path.GetFileName(localFilePath); 19 string tempFilePath = string.Format("{0}{1}", Path.GetTempPath(), fileName); 20 File.Copy(localFilePath, tempFilePath, true); 21 FileStream fs = new FileStream(tempFilePath, FileMode.Open, FileAccess.Read); 22 BinaryReader br = new BinaryReader(fs); 23 byte[] fileContent = br.ReadBytes((int)fs.Length); 24 br.Close(); 25 fs.Close(); 26 Copy service = CreateCopy(domain, userAccount, pwd); 27 service.Timeout = System.Threading.Timeout.Infinite; 28 FieldInformation fieldInfo = new FieldInformation(); 29 FieldInformation[] fieldInfoArr = { fieldInfo }; 30 CopyResult[] resultArr; 31 service.CopyIntoItems( 32 tempFilePath, 33 new string[] { string.Format("{0}{1}", documentLibraryUrl, fileName) }, 34 fieldInfoArr, 35 fileContent, 36 out resultArr); 37 isSuccess = resultArr[0].ErrorCode == CopyErrorCode.Success; 38 if (!isSuccess) 39 { 40 statusInfo = string.Format("Failed Info: {0}", resultArr[0].ErrorMessage); 41 } 42 43 } 44 catch (Exception ex) 45 { 46 statusInfo = string.Format("Failed Info: {0}", ex.Message); 47 isSuccess = false; 48 } 49 return isSuccess; 50 } 51 52 public bool DownloadFileFromSPSite(string domain, string userAccount, string pwd, string documentUrl, string localFilePath, ref string statusInfo) 53 { 54 bool isSuccess = false; 55 try 56 { 57 Copy service = CreateCopy(domain, userAccount, pwd); 58 service.Timeout = System.Threading.Timeout.Infinite; 59 FieldInformation[] fieldInfoArr; 60 byte[] fileContent; 61 service.GetItem(documentUrl,out fieldInfoArr,out fileContent); 62 if (fileContent != null) 63 { 64 FileStream fs = new FileStream(localFilePath, FileMode.Create, FileAccess.Write); 65 fs.Write(fileContent, 0, fileContent.Length); 66 fs.Close(); 67 isSuccess = true; 68 } 69 else 70 { 71 statusInfo = string.Format("Failed Info: {0}不存在", documentUrl); 72 isSuccess = false; 73 } 74 } 75 catch (Exception ex) 76 { 77 statusInfo = string.Format("Failed Info: {0}", ex.Message); 78 isSuccess = false; 79 } 80 return isSuccess; 81 } 82 83 private Copy CreateCopy(string domain, string userAccount, string pwd) 84 { 85 Copy service = new Copy(); 86 if (String.IsNullOrEmpty(userAccount)) 87 { 88 service.UseDefaultCredentials = true; 89 } 90 else 91 { 92 service.Credentials = new NetworkCredential(userAccount, pwd, domain); 93 } 94 return service; 95 } 96 } 97 }
WebClientOperation.cs
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.IO; 6 using System.Net; 7 8 namespace FileOperationAboutSharePoint.FileOperation 9 { 10 public class WebClientOperation : IFileOperation 11 { 12 public bool UploadFileToSPSite(string domain, string userAccount, string pwd, string documentLibraryUrl, string localFilePath, ref string statusInfo) 13 { 14 bool isSuccess = false; 15 try 16 { 17 string fileName = Path.GetFileName(localFilePath); 18 string tempFilePath = string.Format("{0}{1}", Path.GetTempPath(), fileName); 19 File.Copy(localFilePath, tempFilePath, true); 20 FileStream fs = new FileStream(tempFilePath, FileMode.Open, FileAccess.Read); 21 BinaryReader br = new BinaryReader(fs); 22 byte[] fileContent = br.ReadBytes((int)fs.Length); 23 br.Close(); 24 fs.Close(); 25 WebClient webClient = CreateWebClient(domain, userAccount, pwd); 26 webClient.UploadData(string.Format("{0}{1}", documentLibraryUrl, fileName), "PUT", fileContent); 27 isSuccess = true; 28 } 29 catch (Exception ex) 30 { 31 statusInfo = string.Format("Failed Info: {0}", ex.Message); 32 isSuccess = false; 33 } 34 return isSuccess; 35 } 36 37 public bool DownloadFileFromSPSite(string domain, string userAccount, string pwd, string documentUrl, string localFilePath, ref string statusInfo) 38 { 39 bool isSuccess = false; 40 try 41 { 42 WebClient webClient = CreateWebClient(domain, userAccount, pwd); 43 byte[] fileContent = webClient.DownloadData(documentUrl); 44 FileStream fs = new FileStream(localFilePath, FileMode.Create, FileAccess.Write); 45 fs.Write(fileContent, 0, fileContent.Length); 46 fs.Close(); 47 } 48 catch (Exception ex) 49 { 50 statusInfo = string.Format("Failed Info: {0}", ex.Message); 51 isSuccess = false; 52 } 53 return isSuccess; 54 } 55 56 private WebClient CreateWebClient(string domain, string userAccount, string pwd) 57 { 58 WebClient webClient = new WebClient(); 59 if (String.IsNullOrEmpty(userAccount)) 60 { 61 webClient.UseDefaultCredentials = true; 62 } 63 else 64 { 65 webClient.Credentials = new NetworkCredential(userAccount, pwd, domain); 66 } 67 return webClient; 68 } 69 } 70 }
WebRequestOperation.cs
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.IO; 6 using System.Net; 7 8 namespace FileOperationAboutSharePoint.FileOperation 9 { 10 public class WebRequestOperation : IFileOperation 11 { 12 public bool UploadFileToSPSite(string domain, string userAccount, string pwd, string documentLibraryUrl, string localFilePath, ref string statusInfo) 13 { 14 bool isSuccess = false; 15 try 16 { 17 string fileName = Path.GetFileName(localFilePath); 18 string tempFilePath = string.Format("{0}{1}", Path.GetTempPath(), fileName); 19 File.Copy(localFilePath, tempFilePath, true); 20 FileStream fs = new FileStream(tempFilePath, FileMode.Open, FileAccess.Read); 21 BinaryReader br = new BinaryReader(fs); 22 byte[] fileContent = br.ReadBytes((int)fs.Length); 23 br.Close(); 24 fs.Close(); 25 MemoryStream ms = new MemoryStream(fileContent); 26 WebRequest webRequest = CreateWebRequest(domain,userAccount,pwd,string.Format("{0}{1}", documentLibraryUrl, fileName)); 27 webRequest.Method = "PUT"; 28 webRequest.Headers.Add("Overwrite", "T"); 29 webRequest.Timeout = System.Threading.Timeout.Infinite; 30 Stream outStream = webRequest.GetRequestStream(); 31 byte[] buffer = new byte[1024]; 32 while (true) 33 { 34 int i = ms.Read(buffer, 0, buffer.Length); 35 if (i <= 0) 36 break; 37 outStream.Write(buffer, 0, i); 38 } 39 ms.Close(); 40 outStream.Close(); 41 webRequest.GetResponse(); 42 isSuccess = true; 43 } 44 catch (Exception ex) 45 { 46 statusInfo = string.Format("Failed Info: {0}", ex.Message); 47 isSuccess = false; 48 } 49 return isSuccess; 50 } 51 52 public bool DownloadFileFromSPSite(string domain, string userAccount, string pwd, string documentUrl, string localFilePath, ref string statusInfo) 53 { 54 bool isSuccess = false; 55 try 56 { 57 WebRequest webRequest = CreateWebRequest(domain, userAccount, pwd, documentUrl); 58 webRequest.Method = "GET"; 59 webRequest.Timeout = System.Threading.Timeout.Infinite; 60 using (Stream stream = webRequest.GetResponse().GetResponseStream()) 61 { 62 using (FileStream fs = new FileStream(localFilePath, FileMode.Create, FileAccess.Write)) 63 { 64 byte[] buffer = new byte[1024]; 65 int i = 1; 66 while (i > 0) 67 { 68 i = stream.Read(buffer, 0, buffer.Length); 69 fs.Write(buffer, 0, i); 70 } 71 } 72 } 73 isSuccess = true; 74 } 75 catch (Exception ex) 76 { 77 statusInfo = string.Format("Failed Info: {0}", ex.Message); 78 isSuccess = false; 79 } 80 return isSuccess; 81 } 82 83 private WebRequest CreateWebRequest(string domain, string userAccount, string pwd, string requestUriString) 84 { 85 WebRequest webRequest = WebRequest.Create(requestUriString); 86 if (String.IsNullOrEmpty(userAccount)) 87 { 88 webRequest.UseDefaultCredentials = true; 89 } 90 else 91 { 92 webRequest.Credentials = new NetworkCredential(userAccount, pwd, domain); 93 } 94 return webRequest; 95 } 96 } 97 }
Web.config
1 <?xml version="1.0"?> 2 <configuration> 3 <configSections> 4 <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 5 <section name="FileOperationAboutSharePoint.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 6 </sectionGroup> 7 </configSections> 8 9 <system.web> 10 <compilation debug="true" targetFramework="4.0" /> 11 <authentication mode="Windows"> 12 </authentication> 13 </system.web> 14 15 <system.webServer> 16 <modules runAllManagedModulesForAllRequests="true"/> 17 </system.webServer> 18 <system.serviceModel> 19 <bindings /> 20 <client /> 21 </system.serviceModel> 22 <applicationSettings> 23 <FileOperationAboutSharePoint.Properties.Settings> 24 <setting name="FileOperationAboutSharePoint_SPCopyService_Copy" 25 serializeAs="String"> 26 <value>http://ifca-psserver/_vti_bin/copy.asmx</value> 27 </setting> 28 </FileOperationAboutSharePoint.Properties.Settings> 29 </applicationSettings> 30 <appSettings> 31 <add key="domain" value="IFCA"/> 32 <add key="userAccount" value="huangjianwu"/> 33 <add key="pwd" value="ifca.123456"/> 34 <add key="documentLibraryUrl" value="http://ifca-psserver/KDIT/"/> 35 <add key="downloadFileName" value="提示信息Message说明文档.docx"/> 36 <add key="downloadToLocalFilePath" value="C:\\Users\Administrator\Desktop\download_提示信息Message说明文档.docx"/> 37 </appSettings> 38 </configuration>
Default.aspx
上传操作:<asp:FileUpload ID="fuSelectFile" runat="server" /> <asp:Button ID="btnUpload" Text="上传" runat="server" Style="margin: 0 10px;" OnClick="btnUpload_Click" /><br /> 下载操作:“<%= string.Format("{0}{1}",documentLibraryUrl, downloadFileName)%>”文件 <asp:Button ID="btnDownload" Text="下载" runat="server" Style="margin: 5px 10px;" OnClick="btnDownload_Click" /> <p /><strong>执行结果:</strong><br /> <asp:Literal ID="ltrInfo" runat="server"></asp:Literal>
Default.aspx.cs
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.UI; 6 using System.Web.UI.WebControls; 7 using FileOperationAboutSharePoint.FileOperation; 8 using System.Web.Configuration; 9 10 namespace FileOperationAboutSharePoint 11 { 12 public partial class _Default : System.Web.UI.Page 13 { 14 private string domain = WebConfigurationManager.AppSettings["domain"]; 15 private string userAccount = WebConfigurationManager.AppSettings["userAccount"]; 16 private string pwd = WebConfigurationManager.AppSettings["pwd"]; 17 protected string documentLibraryUrl = WebConfigurationManager.AppSettings["documentLibraryUrl"]; 18 protected string downloadFileName = WebConfigurationManager.AppSettings["downloadFileName"]; 19 private string downloadToLocalFilePath = WebConfigurationManager.AppSettings["downloadToLocalFilePath"]; 20 21 protected void Page_Load(object sender, EventArgs e) 22 { 23 24 } 25 26 protected void btnUpload_Click(object sender, EventArgs e) 27 { 28 if (fuSelectFile.HasFile) 29 { 30 31 string localFilePath = string.Format("{0}\\{1}", Server.MapPath("Upload"), fuSelectFile.PostedFile.FileName); 32 fuSelectFile.PostedFile.SaveAs(localFilePath); 33 string statusInfo = ""; 34 //IFileOperation fileOperation = new WebClientOperation(); 35 //IFileOperation fileOperation = new WebRequestOperation(); 36 IFileOperation fileOperation = new SPServiceOperation(); 37 bool isSuccess = fileOperation.UploadFileToSPSite(domain, userAccount, pwd, documentLibraryUrl, localFilePath, ref statusInfo); 38 ltrInfo.Text = isSuccess ? "上传成功" : statusInfo; 39 } 40 else 41 { 42 ltrInfo.Text = "请选择需要上传的文件"; 43 } 44 } 45 46 protected void btnDownload_Click(object sender, EventArgs e) 47 { 48 string statusInfo = ""; 49 //IFileOperation fileOperation = new WebClientOperation(); 50 //IFileOperation fileOperation = new WebRequestOperation(); 51 IFileOperation fileOperation = new SPServiceOperation(); 52 bool isSuccess = fileOperation.DownloadFileFromSPSite(domain, userAccount, pwd, string.Format("{0}{1}", documentLibraryUrl, downloadFileName), downloadToLocalFilePath, ref statusInfo); 53 ltrInfo.Text = isSuccess ? string.Format("下载成功<br/>下载文件位置为:{0}", downloadToLocalFilePath) : statusInfo; 54 } 55 } 56 }
结果:
PS:如用第一种方式,就得在Visual Studio中添加Web Service,服务来源,例如:
http://ifca-psserver/_vti_bin/copy.asmx