53

How do you programmatically upload a file to a document library in sharepoint?

I am currently making a Windows application using C# that will add documents to a document library list.

Helen
  • 87,344
  • 17
  • 243
  • 314
Adyt
  • 1,442
  • 7
  • 26
  • 38
  • duplicate of https://stackoverflow.com/questions/21508773/how-to-upload-a-document-to-sharepoint-programmatically – john k Nov 03 '22 at 14:58

7 Answers7

74

You can upload documents to SharePoint libraries using the Object Model or SharePoint Webservices.

Upload using Object Model:

String fileToUpload = @"C:\YourFile.txt";
String sharePointSite = "http://yoursite.com/sites/Research/";
String documentLibraryName = "Shared Documents";

using (SPSite oSite = new SPSite(sharePointSite))
{
    using (SPWeb oWeb = oSite.OpenWeb())
    {
        if (!System.IO.File.Exists(fileToUpload))
            throw new FileNotFoundException("File not found.", fileToUpload);                    

        SPFolder myLibrary = oWeb.Folders[documentLibraryName];

        // Prepare to upload
        Boolean replaceExistingFiles = true;
        String fileName = System.IO.Path.GetFileName(fileToUpload);
        FileStream fileStream = File.OpenRead(fileToUpload);

        // Upload document
        SPFile spfile = myLibrary.Files.Add(fileName, fileStream, replaceExistingFiles);

        // Commit 
        myLibrary.Update();
    }
}
Snowbear
  • 16,924
  • 3
  • 43
  • 67
Henrique Zacchi
  • 1,174
  • 12
  • 17
  • 4
    Chadworthington, SPSite is part of Microsoft.SharePoint namespace, so you need to add reference to Microsoft.SharePoint.dll. Assuming you are developing on the Server, the dll can be found here: C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\ISAPI\Microsoft.SharePoint.dll – Henrique Zacchi Jun 04 '09 at 09:23
  • 1
    Wait a sec... this code will only work in a box joined to the farm, correct? In any other box, it needs to use http://msdn.microsoft.com/en-us/library/ee857094.aspx – Ariel May 05 '11 at 02:35
  • @Ariel You are correct. The client APIs are the way to access the SharePoint server from the outside. Also see http://msdn.microsoft.com/en-us/library/ee537564.aspx – Tom Resing Aug 05 '11 at 16:19
  • 5
    You dont need to call myLibrary.Update(); file adds after Files.Add(..) – gdbdable Jun 10 '12 at 12:45
  • @Henrique Zacchi, I dont see any folder named web server extensions in the path "C:\Program Files\Common Files\microsoft shared". Do I need to install sharepoint in my machine? – Green goblin Oct 08 '13 at 20:03
  • 1
    This worked well for me, except that I had to use a "using" on the filestream when deleting the file afterwards (for the delete to work). I changed it to: using (FileStream fileStream = File.OpenRead(fileToUpload)) { // Upload document SPFile spfile = doclib.Files.Add(fileName, fileStream, replaceExistingFiles); } – B. Clay Shannon-B. Crow Raven Jul 28 '15 at 22:49
  • 2
    This is not a good solution. It needs to be run as someone who is both a DBO and a SP Farm administrator, which is a ridiculous over-priv for the task of uploading a file. – Michael Blackburn Jun 24 '16 at 15:52
  • I want to do same thinking to create a Document and host to SharePoint using .net Core MVC – ZCoder Jun 26 '19 at 14:58
13

if you get this error "Value does not fall within the expected range" in this line:

SPFolder myLibrary = oWeb.Folders[documentLibraryName];

use instead this to fix the error:

SPFolder myLibrary = oWeb.GetList(URL OR NAME).RootFolder;

Use always URl to get Lists or others because they are unique, names are not the best way ;)

Ricardo Vieira
  • 730
  • 7
  • 13
10

With SharePoint 2013 new library, I managed to do something like this:

private void UploadToSharePoint(string p, out string newUrl)  //p is path to file to load
{
    string siteUrl = "https://myCompany.sharepoint.com/site/";
    //Insert Credentials
    ClientContext context = new ClientContext(siteUrl);

    SecureString passWord = new SecureString();
    foreach (var c in "mypassword") passWord.AppendChar(c);
    context.Credentials = new SharePointOnlineCredentials("myUserName", passWord);
    Web site = context.Web;

    //Get the required RootFolder
    string barRootFolderRelativeUrl = "Shared Documents/foo/bar";
    Folder barFolder = site.GetFolderByServerRelativeUrl(barRootFolderRelativeUrl);

    //Create new subFolder to load files into
    string newFolderName = baseName + DateTime.Now.ToString("yyyyMMddHHmm");
    barFolder.Folders.Add(newFolderName);
    barFolder.Update();

    //Add file to new Folder
    Folder currentRunFolder = site.GetFolderByServerRelativeUrl(barRootFolderRelativeUrl + "/" + newFolderName);
    FileCreationInformation newFile = new FileCreationInformation { Content = System.IO.File.ReadAllBytes(@p), Url = Path.GetFileName(@p), Overwrite = true };
    currentRunFolder.Files.Add(newFile);
    currentRunFolder.Update();

    context.ExecuteQuery();

    //Return the URL of the new uploaded file
    newUrl = siteUrl + barRootFolderRelativeUrl + "/" + newFolderName + "/" + Path.GetFileName(@p);
}
soccer7
  • 3,547
  • 3
  • 29
  • 50
Uziel Sulkies
  • 598
  • 5
  • 15
  • Hello, I am getting below error. System.NotSupportedException: The given path's format is not supported. at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) can you please help? – User5590 Jul 09 '15 at 12:58
  • Which row gives you this exception? – Uziel Sulkies Jul 12 '15 at 08:27
8
string filePath = @"C:\styles\MyStyles.css"; 
string siteURL = "http://example.org/"; 
string libraryName = "Style Library"; 

using (SPSite oSite = new SPSite(siteURL)) 
{ 
    using (SPWeb oWeb = oSite.OpenWeb()) 
    { 
        if (!System.IO.File.Exists(filePath)) 
            throw new FileNotFoundException("File not found.", filePath);                     

        SPFolder libFolder = oWeb.Folders[libraryName]; 

        // Prepare to upload 
        string fileName = System.IO.Path.GetFileName(filePath); 
        FileStream fileStream = File.OpenRead(filePath); 

        //Check the existing File out if the Library Requires CheckOut
        if (libFolder.RequiresCheckout)
        {
            try {
                SPFile fileOld = libFolder.Files[fileName];
                fileOld.CheckOut();
            } catch {}
        }

        // Upload document 
        SPFile spfile = libFolder.Files.Add(fileName, fileStream, true); 

        // Commit  
        myLibrary.Update(); 

        //Check the File in and Publish a Major Version
        if (libFolder.RequiresCheckout)
        {
                spFile.CheckIn("Upload Comment", SPCheckinType.MajorCheckIn);
                spFile.Publish("Publish Comment");
        }
    } 
} 
soccer7
  • 3,547
  • 3
  • 29
  • 50
user1735365
  • 89
  • 1
  • 2
6

As an alternative to the webservices, you can use the put document call from the FrontPage RPC API. This has the additional benefit of enabling you to provide meta-data (columns) in the same request as the file data. The obvious drawback is that the protocol is a bit more obscure (compared to the very well documented webservices).

For a reference application that explains the use of Frontpage RPC, see the SharePad project on CodePlex.

Paul-Jan
  • 16,746
  • 1
  • 63
  • 95
5
try
{
    //Variablen für die Verarbeitung
    string source_file = @"C:\temp\offer.pdf";
    string web_url = "https://stackoverflow.sharepoint.com";
    string library_name = "Documents";
    string admin_name = "admin@stackoverflow.com";
    string admin_password = "Password";

    //Verbindung mit den Login-Daten herstellen
    var sercured_password = new SecureString();
    foreach (var c in admin_password) sercured_password.AppendChar(c);
    SharePointOnlineCredentials credent = new 
    SharePointOnlineCredentials(admin_name, sercured_password);

    //Context mit Credentials erstellen
    ClientContext context = new ClientContext(web_url);
    context.Credentials = credent;

    //Bibliothek festlegen
    var library = context.Web.Lists.GetByTitle(library_name);

    //Ausgewählte Datei laden
    FileStream fs = System.IO.File.OpenRead(source_file);

    //Dateinamen aus Pfad ermitteln
    string source_filename = Path.GetFileName(source_file);

    //Datei ins SharePoint-Verzeichnis hochladen
    FileCreationInformation fci = new FileCreationInformation();
    fci.Overwrite = true;
    fci.ContentStream = fs;
    fci.Url = source_filename;
    var file_upload = library.RootFolder.Files.Add(fci);

    //Ausführen
    context.Load(file_upload);
    context.ExecuteQuery();
    
    //Datenübertragen schließen
    fs.Close();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message, "Fehler");
    throw;
}
soccer7
  • 3,547
  • 3
  • 29
  • 50
Eren Pak
  • 51
  • 1
  • 1
0

I used this article to allow to c# to access to a sharepoint site.

http://www.thesharepointguide.com/access-office-365-using-a-console-application/

Basically you create a ClientId and ClientSecret keys to access to the site with c#

Hope this can help you!

Xtremexploit
  • 319
  • 4
  • 7
  • its June 2023, do you think this thread can serve as a good guide to go from FileShare to SharePoint upload, can be it done in stand alone C# script via SSIS? or I need create whole project ? Thanks Mario – Mario Trento May 31 '23 at 22:25