I need to copy some documents from a SharePoint 2003 server to a MOSS 2007 server to make them available on our Internet sites. This is quite easily achieved using the object model but what I also need is to move the metadata associated with the document so I can filter correctly on the Internet site.
To do this I have started by creating a couple of methods. One to download the document from SharePoint to a file system folder and create an xml document that contains the metadata in the same folder. The second method uploads the document with it the metadata to a destination SharePoint document library.
private void DownloadDocumentFromLibrary()
{
try
{
//get site
SPSite oSite = new SPSite("http://Localhost");
using(oSite)
{
//get the rootSite
SPWeb oWeb = oSite.RootWeb;
SPList oList = oWeb.Lists["Shared Documents"];
foreach(SPListItem oItem in oList.Items)
{
//get meta-data for the item
string strXML = oItem.Xml.ToString();
TextWriter tw = new StreamWriter("c:\\MyDownloadFolder\\"+oItem["Name"]+".xml");
//write xml to file
tw.WriteLine(strXML);
tw.Close();
//get document
byte[] binFile = oItem.File.OpenBinary();
System.IO.FileStream fstream = System.IO.File.Create("c:\\MyDownloadFolder\\" + oItem["Name"]);
//write document to folder
fstream.Write(binFile, 0, binFile.Length);
}
}
}
catch(Exception err)
{
Console.WriteLine(err.Message);
}
}
The second method then takes the downloaded files and uploads them to the Internet server document library. You may need to find a way to physically move the files across the network using FTP or something similar depending on where your Internet server is and what security surrounds it.
private void UploadDocumentFromFileShare()
{
try
{
//get site
SPSite oSite = new SPSite("http://Localhost");
// Process the list of files found in the directory.
string [] fileEntries = Directory.GetFiles(@"c:\mydownloadfolder");
foreach(string fileName in fileEntries)
{
//check file type to see if it is an xml document
int iFileNameLength = fileName.Length;
string strFileExtension = fileName.Substring(iFileNameLength-4,4);
if(strFileExtension != ".xml")
{
//Load the local file into a stream
FileStream stream = File.OpenRead(fileName);
byte[] content = new byte[stream.Length];
//Read the file into a byte array
stream.Read(content,0,(int)stream.Length);
stream.Close();
using(oSite)
{
//Get the rootSite
SPWeb oWeb = oSite.RootWeb;
//Get the folder that should store the document
SPFolder folder = oWeb.Folders["upload"];
string[] strSplitFileName = fileName.Split('\\');
string strFileName = strSplitFileName[strSplitFileName.Length-1];
//add document to library
folder.Files.Add(folder.Url + "/" + strFileName, content,true);
//get list
SPList oList = oWeb.Lists["upload"];
//create query to get added document item
SPQuery oQuery = new SPQuery();
oQuery.Query = "<Where><Eq><FieldRef Name='FileLeafRef' /><Value Type='File'>"+strFileName+"</Value></Eq></Where>";
SPListItemCollection oItems = oList.GetItems(oQuery);
//get xml for document properties
XmlTextReader reader = new XmlTextReader(fileName+".xml");
XmlDocument doc = new XmlDocument();
doc.Load(reader);
XmlElement root = doc.DocumentElement;
XmlNode node = root.Attributes.GetNamedItem("ows_Column1");
string strColumn1= node.Value.ToString();
foreach(SPListItem oItem in oItems)
{
string strTitle = "";
strTitle = strFileName.Substring(0,strFileName.Length-4);
oItem["Title"] = strTitle;
oItem["Column1"] = strColumn1;
oItem.Update();
}
}
}
}
}
catch(Exception err)
{
Console.WriteLine(err.Message);
}
}
It is also possible to download attachments from an item using the following code:
private void DownloadAttachmentFromItem()
{
//download attachment from a list to file system
SPWeb web = new SPSite("http://localhost").OpenWeb();
//Open List
SPList list = web.Lists["Doc List"];
foreach(SPListItem oItem in list.Items)
{
//get meta-data for the item
string strXML = oItem.Xml.ToString();
TextWriter tw = new StreamWriter("c:\\MyDownloadFolder\\"+oItem["Title"]+".xml");
tw.WriteLine(strXML);
tw.Close();
//Get the folder
SPFolder folder = web.Folders["Lists"].SubFolders["Doc List"].SubFolders["Attachments"].SubFolders[oItem.ID.ToString()];
//download attachment
foreach(SPFile oFile in folder.Files)
{
byte[] binaryFile = oFile.OpenBinary();
System.IO.FileStream fstream = System.IO.File.Create("c:\\MyDownloadFolder\\" + oItem["Title"]);
fstream.Write(binaryFile, 0, binaryFile.Length);
}
}
}
Currently rated 5.0 by 3 people
- Currently 5/5 Stars.
- 1
- 2
- 3
- 4
- 5