user3590460
user3590460

Reputation: 411

How to upload a file to sharepoint site using python script

Is there a way to upload a file on sharepoint site using python script? I tried installing haufe.sharepoint, but it seems like it failed to fetch ntlm while it was installing, and I can't even use the connector module without having ntlm installed.

I've also tried just saving the excel file to the server location (so save it to directory like \server\sharepointsite\files instead of connecting via the URL) using openpyxl, but it looks like the file remains checked out after the file is saved..

I would appreciate any help. Thanks!!

Upvotes: 33

Views: 142628

Answers (7)

Josh
Josh

Reputation: 531

I'll start by saying this example is adapted from the example for Office365-REST-Python-Client. It works with Sharepoint online using the REST API.

https://github.com/vgrem/Office365-REST-Python-Client/blob/master/examples/sharepoint/files/upload_file.py

Example URL you might want to upload to [baseurl][site][folder][file]. https://your_company.sharepoint.com/path/to/site/Shared Documents/file.txt

import os
from office365.runtime.auth.authentication_context import AuthenticationContext
from office365.sharepoint.client_context import ClientContext

baseurl = 'https://your_company.sharepoint.com'
basesite = '/path/to/site' # every share point has a home.
siteurl = baseurl + basesite 

localpath = './file.txt'
remotepath = "Shared Documents/file.txt" # existing folder path under sharepoint site.

ctx_auth = AuthenticationContext(siteurl) # should also be the siteurl
ctx_auth.acquire_token_for_user(username, password)
ctx = ClientContext(siteurl, ctx_auth) # make sure you auth to the siteurl.

with open(localpath, 'rb') as content_file:
    file_content = content_file.read()

dir, name = os.path.split(remotepath)
file = ctx.web.get_folder_by_server_relative_url(dir).upload_file(name, file_content).execute_query()

Upvotes: 23

nurealam siddiq
nurealam siddiq

Reputation: 1623

You could upload files with SharePlum

install SharePlum: pip install SharePlum and try the code below

import requests
from shareplum import Office365

# Set Login Info
username = '<username>'
password = '<password>'
site_name = '<site_name>'
base_path = 'https://<domain_name>.sharepoint.com'
doc_library = 'Shared%20Documents'
nested_folder = 'Shared%20Documents/<folder1>/<folder2>' #if you want to upload in nested folders else nested_folder = doc_library
file_name = "my_file.zip" #when your file in the same directory

# Obtain auth cookie
authcookie = Office365(base_path, username=username, password=password).GetCookies()
session = requests.Session()
session.cookies = authcookie
session.headers.update({'user-agent': 'python_bite/v1'})
session.headers.update({'accept': 'application/json;odata=verbose'})

session.headers.update({'X-RequestDigest': 'FormDigestValue'})
response = session.post(url=base_path + "/sites/" + site_name + "/_api/web/GetFolderByServerRelativeUrl('" + doc_library + "')/Files/add(url='a.txt',overwrite=true)",
                         data="")
session.headers.update({'X-RequestDigest': response.headers['X-RequestDigest']})

# Upload file
with open(file_name, 'rb') as file_input:
    try:
        response = session.post(
            url=base_path + "/sites/" + site_name + f"/_api/web/GetFolderByServerRelativeUrl('" + nested_folder + "')/Files/add(url='"
            + file_name + "',overwrite=true)",

            data=file_input)
        print("response: ", response.status_code) #it returns 200
        if response.status_code == '200':
            print("File uploaded successfully")
    except Exception as err:
        print("Something went wrong: " + str(err))

print('File Uploaded Successfully')

Upvotes: 5

Michele
Michele

Reputation: 29

I have created a script to upload attachment into a SharePoint list let me know if it works

import requests
from shareplum import Office365

# Obtain auth cookie
authcookie = Office365('https://YOUR-NAME.sharepoint.com', username='YOUR-USERNAME',password='YOUR-PASSWORD').GetCookies()
session = requests.Session()
session.cookies = authcookie
session.headers.update({'user-agent': 'python_bite/v1'})
session.headers.update({'accept': 'application/json;odata=verbose'})

# dirty workaround.... I'm getting the X-RequestDigest from the first failed call
session.headers.update({'X-RequestDigest': 'FormDigestValue'})
response = session.post(url="https://YOUR-NAME.sharepoint.com/sites/YOU-SITE/_api/web/GetFolderByServerRelativeUrl('YOUR-FOLDER')/Files/add(url='a.txt',overwrite=true)",data="")
session.headers.update({'X-RequestDigest': response.headers['X-RequestDigest']})

# perform the upload
fileName = 'picture.png'
file_name = 'images.png'
with open(file_name, 'rb') as file_input:
    response = session.post(
        url="https://YOUR-NAME.sharepoint.com/sites/YOUR-SITE/_api/web/lists/getbytitle('ID-ROW-INTO-SHAREPOINT')/items(4)/AttachmentFiles/add(FileName='" + fileName + "')",data=file_input)
    print(response.text)

Upvotes: 0

Mikus
Mikus

Reputation: 61

The answers above didn't work for me. I have found a simple and nice way by just mapping a drive to my sharepoint folder and then I used a copy to that drive.

import subprocess
import shutil
subprocess.call(r'net use Y: http://sharepoint/link/to/your/folder', shell=True)
shutil.copy("link_to_local_file","Y:\\")

Instead of copy, You can also delete files or do anything like a normal folder.

Upvotes: 2

Mohanty.pyt
Mohanty.pyt

Reputation: 81

I think I might be a bit late in answering this question.

The following solution worked for me-

In the Sharepoint webpage, Go to Library Tools>> Library>> Open with Explorer Command( Its the tiny icon in the bottom right beside Connect to Office command.

The address bar gives us the address that we need to upload the file to. Remember to remove "http:" or "https:" from the address This address is your destination to upload the file.

Subsequently you can use shutil package to upload the file.

import shutil as sl
sl.copy(source,destination)

This should help you upload files to Sharepoint

Disclaimer- This works quite well in Python 3.6

Upvotes: 3

Ragini Sharma
Ragini Sharma

Reputation: 1

I have created a file in SharePoint site in python via rest api calls. Please find my code below.

def CreateHomePage():
    server_relative_url = base_url+ '/_api/web/webinfos'

r1 = requests.get(server_relative_url, auth=HttpNtlmAuth(username, password), headers = headers, verify=True)

value = json.loads(r1.text)
for row in value['d']['results']:
    if(row['Title'] == myvars['Site Name'].strip(' \t\n\r')):
        Id= row['ServerRelativeUrl']

#Add Template and create file simultaneously
title = myvars['Site Name'].strip(' \t\n\r')  
post_url = root_url  +'GetFolderByServerRelativeUrl(\'/'+Id+'/Pages\')/Files/add(url=\'Home.aspx\',overwrite=true)'
r2 = requests.post(post_url, auth=HttpNtlmAuth(username, password), headers = headers, verify=True)

logger.debug("Creation of home page %d", r2.status_code)

Upvotes: 0

Calanas
Calanas

Reputation: 61

haufe.sharepoint only works for sharepoint lists, but you probably need access to document libraries.

You should use Python Requests with the help of Sharepoint's REST API.

If your sharepoint site doesn't support BasicAuth I recommend the requests_ntlm package.

It didn't work for me due to other reasons, but maybe it helps you out a bit.

Upvotes: 6

Related Questions