WSS3SDK之:如何从本地文件夹上传文件到SharePoint站点
发布日期:2021-06-29 03:55:05 浏览次数:2 分类:技术文章

本文共 5059 字,大约阅读时间需要 16 分钟。

本节将展示如何从本地上传一个文件到WSS站点。通过使用EnsureParentFolder方法来确保目标文件夹有效。

步骤
1、在VS 2005中创建一个Web应用程序,添加FormDigest控件,并在.aspx文件中引用Microsoft.SharePoint.WebControls命名空间,如下:

<%
@ Register Tagprefix
=
"
SharePoint
"
 
      Namespace
=
"
Microsoft.SharePoint.WebControls
"
 
   Assembly
=
"
Microsoft.SharePoint, Version=11.0.0.0, 
      Culture
=
neutral, 
   PublicKeyToken
=
71e9bce111e9429c
"
 %>

注意:

我们可以从默认WSS部署中的default.aspx文件中获取PubliceKeyToken的值,该文件位于 Local_Drive:/Program Files/Common Files/Microsoft Shared/web server extensions/12/TEMPLATE/SiteTemplates/sts文件夹。或者从Microsoft.SharePoint组件所提供 的信息中获取,该组件位于资源管理器中的Local_Drive:/%WINDOWS%/assembly。
2、添加一个HtmlInputFile控件,一个textbox,和一个button到.aspx页面form中。

<
form 
id
="Form1"
 method
="post"
 runat
="server"
>
   
<
SharePoint:FormDigest 
runat
="server"
 
/>
   
<
input 
id
="File1"
 type
="file"
 runat
="server"
 title
="upldFileBox"
>
   
<
asp:Button 
id
="Button1"
 runat
="server"
 
      Text
="Upload File"
></
asp:Button
>
   
<
asp:TextBox 
id
="TextBox1"
 runat
="server"
></
asp:TextBox
>
</
form
>

3、在.aspx.cs code-beihind文件中,添加System.IO和Microsoft.SharePoint命名空间。

VB

Imports
 System.IO
Imports
 Microsoft.SharePoint

C#

using
 System.IO;
using
 Microsoft.SharePoint;

4、添加下列代码到button的Click事件。

VB

If
 File1.PostedFile 
Is
 
Nothing
 
Then
    
Return
End
 
If
 
Dim
 destUrl 
As
 
String
 
=
 TextBox1.Text
Dim
 site 
As
 SPWeb 
=
 
New
 SPSite(destUrl).OpenWeb()
Dim
 fStream 
As
 Stream 
=
 File1.PostedFile.InputStream
Dim
 contents(fStream.Length) 
As
 
Byte
fStream.Read(contents, 
0
CInt
(fStream.Length))
fStream.Close()
EnsureParentFolder(site, destUrl)
site.Files.Add(destUrl, contents)

 

C#

if
 (File1.PostedFile 
==
 
null
)
    
return
;
string
 destUrl 
=
 TextBox1.Text;
SPWeb site 
=
 
new
 SPSite(destUrl).OpenWeb();
Stream fStream 
=
 File1.PostedFile.InputStream;
byte
[] contents 
=
 
new
 
byte
[fStream.Length];
fStream.Read(contents, 
0
, (
int
)fStream.Length);
fStream.Close(); 
EnsureParentFolder(site, destUrl);
site.Files.Add(destUrl, contents);

传递给destUrl参数,也就是textbox中输入的目标位置的值必须是一个包含文件名的绝对URL地址。

此外,实例化父站点的SPWeb对象时,可以结合SPSite构造器和OpenWeb方法来验证URL是否属于当前WSS部署。不在当前WSS管辖范围内的URL将抛出参数异常。System.Web.UI.HtmlControls.HtmlInputFile对象用来读取源文件,内容存到一个byte数组中,以便传给SPFileCollection类的Add方法。
5、EnsureParentFolder方法确保了在某网站中目标URL的父文件夹确实存在,并会返回该父文件夹的网站相对URL路径。该方法接受两个参数:一个是由SPWeb对象代表的父站点,另一个是包含绝对URL路径的字符串(从UploadFile方法传过来的)。如果父文件夹不存在,EnsureParentFolder方法将创建它。
VB

Public
 
Function
 EnsureParentFolder(parentSite 
As
 SPWeb, 
        destinUrl 
As
 
String
As
 
String
    destinUrl 
=
 parentSite.GetFile(destinUrl).Url
    
Dim
 index 
As
 
Integer
 
=
 destinUrl.LastIndexOf(
"
/
"
)
    
Dim
 parentFolderUrl 
As
 
String
 
=
 
String
.Empty
    
If
 index 
>
 
-
 
1
 
Then
        parentFolderUrl 
=
 destinUrl.Substring(
0
, index)
        
Dim
 parentFolder 
As
 SPFolder 
            
=
 parentSite.GetFolder(parentFolderUrl)
        
If
 
Not
 parentFolder.Exists 
Then
            
Dim
 currentFolder 
As
 SPFolder 
=
 parentSite.RootFolder
            
Dim
 folder 
As
 
String
            
For
 
Each
 folder 
In
  parentFolderUrl.Split(
"
/
"
c)
                currentFolder 
=
 currentFolder.SubFolders.Add(folder)
            
Next
 folder
        
End
 
If
    
End
 
If
    
Return
 parentFolderUrl
End Function
 
'
EnsureParentFolder

C#

public
 
string
 EnsureParentFolder(SPWeb parentSite, 
string
 destinUrl)
{
    destinUrl 
=
 parentSite.GetFile(destinUrl).Url;
    
int
 index 
=
 destinUrl.LastIndexOf(
"
/
"
);
    
string
 parentFolderUrl 
=
 
string
.Empty;
    
if
 (index 
>
 
-
1
)
    {
        parentFolderUrl 
=
 destinUrl.Substring(
0
, index);
        SPFolder parentFolder 
            
=
 parentSite.GetFolder(parentFolderUrl);
        
if
 (
!
 parentFolder.Exists)
        {
            SPFolder currentFolder 
=
 parentSite.RootFolder;
            
foreach
(
string
 folder 
in
 parentFolderUrl.Split(
'
/
'
))
            {
                currentFolder 
                    
=
 currentFolder.SubFolders.Add(folder);
            }
        }
    }
    
return
 parentFolderUrl;
}

6、SPWeb类的GetFile方法用于与SPFile类的Url属性一并将URL转换成站点相当URL,如果特定的URL在该站点区域内不存在则抛出异常。父文件夹的URL是通过String.LastIndexOf方法通过判断目标URL最末端的斜线(/)的方式计算出来的。如果没有发现斜线(换句话说index等于-1),那么目标就是站点的根文件夹,parentFolderUrl参数将返回空字符串。否则,正如样例中所示,SPWeb类的GetFolder方法返回目标父一级文件夹。如果该文件夹不存在,样例代码将创建该文件夹。

如果要从本地上传一个文件到运行WSS的同一台服务器上,我们可以用System.IO.FileStream对象来代替。这时,需要添加System.IO命名空间的引用。此外,也要引用System和Microsoft.SharePoint命名空间。下面的例子在Click事件处理程序中调用UploadFile方法,它反过来再调用先前创建的EnsurePartentFolder方法。

VB

Public
 
Sub
 UploadFile(srcUrl 
As
 
String
, destUrl 
As
 
String
)
    
If
 
Not
 File.Exists(srcUrl) 
Then
        
Throw
 
New
 ArgumentException(
String
.Format(
"
{0} does not exist
"
            srcUrl), 
"
srcUrl
"
)
    
End
 
If
    
Dim
 site 
As
 SPWeb 
=
 
New
 SPSite(destUrl).OpenWeb()
    
Dim
 fStream 
As
 FileStream 
=
 File.OpenRead(srcUrl)
    
Dim
 contents(fStream.Length) 
As
 
Byte
    fStream.Read(contents, 
0
CInt
(fStream.Length))
    fStream.Close()
    EnsureParentFolder(site, destUrl)
    site.Files.Add(destUrl, contents)
End Sub
 
'
UploadFile

C#

public
 
void
 UploadFile(
string
 srcUrl, 
string
 destUrl)
{
    
if
 (
!
 File.Exists(srcUrl))
    {
        
throw
 
new
 ArgumentException(String.Format(
"
{0} does not exist
"
            srcUrl), 
"
srcUrl
"
);
    }
    SPWeb site 
=
 
new
 SPSite(destUrl).OpenWeb();
    FileStream fStream 
=
 File.OpenRead(srcUrl);
    
byte
[] contents 
=
 
new
 
byte
[fStream.Length];
    fStream.Read(contents, 
0
, (
int
)fStream.Length);
    fStream.Close(); 
    EnsureParentFolder(site, destUrl);
    site.Files.Add(destUrl, contents);
}

UploadFile方法有两个参数。srcUrl参数指定了本地文件系统中的源位置,destUrl参数指定目标位置的绝对URL。System.IO.FileStream对象用于读源文件的内容,并存到byte数组中传给SPFileCollection类的Add方法。

注意:
上传文件的大小不能超过2GB。

转载地址:https://blog.csdn.net/zengjibing/article/details/3815988 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:WSS3SDK之:事件基础
下一篇:WSS3SDK之:如何读取,拷贝和移动文件

发表评论

最新留言

不错!
[***.144.177.141]2024年04月28日 19时53分21秒