Sharepoint์ ํ์ผ์ ์ ๋ก๋ํ๋ ค๊ณ ํฉ๋๋ค. ์ฌ๋ฐ๋ฅธ ๊ฒฝ๋ก์ ์์ต๋๊น?
def upload_file(ctx, listTitle, path):
list_obj = ctx.web.lists.get_by_title(listTitle)
folder = list_obj.root_folder
ctx.load(folder)
ctx.execute_query()
files = folder.files
with open(path, 'rb') as f:
content = f.read()
file_creation_information = FileCreationInformation()
file_creation_information.overwrite = True
file_creation_information.url = path
file_creation_information.content = content
file_new = files.add(file_creation_information)
์ ๋ ์ด๊ฒ์ํ๊ธฐ ์ํด ClientRequest class
๋ง ์ฌ์ฉํ์ต๋๋ค.
def upload_binary_file(self, file):
"""Attempt to upload a binary file to SharePoint"""
folder_url = "folder_to_upload_to"
text_file = basename(file.name)
full_url = "{0}/_api/web/GetFolderByServerRelativeUrl('{1}')/Files/add(url='{2}', overwrite=true)".format(self.base_url, folder_url, text_file)
options = RequestOptions(full_url)
context = ClientContext(full_url, self.ctx_auth)
options.set_header('Accept', 'application/json; odata=verbose')
options.set_header('Content-Type', 'application/octet-stream')
options.set_header('Content-Length', str(os.path.getsize(file.name)))
options.set_header('X-RequestDigest', YOUR_FORM_DIGEST)
options.method = 'POST'
file_name = file.name
with open(file_name, 'rb') as outfile:
# instead of executing the query directly, we'll try to go around
# and set the json data explicitly
context.authenticate_request(options)
data = requests.post(url=full_url, data=outfile, headers=options.headers, auth=options.auth)
if data.status_code == 200:
# our file has uploaded successfully
# let's return the URL
base_site = data.json()['d']['Properties']['__deferred']['uri'].split("/sites")[0]
relative_url = data.json()['d']['ServerRelativeUrl'].replace(' ', '%20')
return base_site + relative_url
else:
return "Log Failed to Upload"
@benpolinsky ์ค ๋ํซ์ ๊ฒ์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ฒ์์๋ ์์ ๋ค์ด์ ์คํธ๋ฅผ ์ป๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์์ง๋ง ๋ฐฉ๋ฒ์ ์์ ๋ด๋ฉด ํจ๊ณผ๊ฐ์์์ต๋๋ค.
from office365.runtime.auth.authentication_context import AuthenticationContext
from office365.sharepoint.client_context import ClientContext
from office365.runtime.utilities.request_options import RequestOptions
from office365.sharepoint.file_creation_information import FileCreationInformation
from settings import settings
import requests
import os
from os.path import basename
ctx_auth = AuthenticationContext(url=settings['url'])
if ctx_auth.acquire_token_for_user(username=settings['username'], password=settings['password']):
upload_binary_file("c:\temp\myfile.txt",ctx_auth)
def upload_binary_file(file_path, ctx_auth):
"""Attempt to upload a binary file to SharePoint"""
base_url = settings['url']
folder_url = "MyFolder"
file_name = basename(file_path)
files_url ="{0}/_api/web/GetFolderByServerRelativeUrl('{1}')/Files/add(url='{2}', overwrite=true)"
full_url = files_url.format(base_url, folder_url, file_name)
options = RequestOptions(settings['url'])
context = ClientContext(settings['url'], ctx_auth)
context.request_form_digest()
options.set_header('Accept', 'application/json; odata=verbose')
options.set_header('Content-Type', 'application/octet-stream')
options.set_header('Content-Length', str(os.path.getsize(file_path)))
options.set_header('X-RequestDigest', context.contextWebInformation.form_digest_value)
options.method = 'POST'
with open(file_path, 'rb') as outfile:
# instead of executing the query directly, we'll try to go around
# and set the json data explicitly
context.authenticate_request(options)
data = requests.post(url=full_url, data=outfile, headers=options.headers, auth=options.auth)
if data.status_code == 200:
# our file has uploaded successfully
# let's return the URL
base_site = data.json()['d']['Properties']['__deferred']['uri'].split("/sites")[0]
relative_url = data.json()['d']['ServerRelativeUrl'].replace(' ', '%20')
return base_site + relative_url
else:
return data.json()['error']
SharePoint์ ํ์ผ์ ์ ๋ก๋ํ๋ ๊ฐ๋จํ API๋ฅผ ์ ํธํฉ๋๋ค. ์ด๊ฒ์ ๋๋ฌด ๋ณต์กํฉ๋๋ค.
@attibalazs ์คํฌ๋ฆฝํธ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ํ์ฌ ์ฌ๊ธฐ์ ๊ฐํ ์์ต๋๋ค.
get_authentication_cookie์์๋ ํ์ผ "C : \ Python27 \ lib \ site-packages \ office365 \ runtime \ auth \ saml_token_provider.py", 65 ํ
return 'FedAuth ='+ self.FedAuth + '; rtFa = '+ self.rtFa
TypeError : 'str'๋ฐ 'NoneType'๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
SP Online URL, ์ฌ์ฉ์ ์ด๋ฆ ๋ฐ ์ํธ ์ธ์ ํด๋ผ์ด์ธํธ ID์ ํด๋ผ์ด์ธํธ ์ํธ๋ ์ฌ์ฉํด์ผ ํ์ต๋๊น?
์ด @attibalazs ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์ ์๋ํ์ต๋๋ค.
์ด ์ฝ๋๋ [email protected] ๊ณผ ๊ฐ์ ์กฐ์ง ๊ณ์ ์์ ์๋ํฉ๋๊น ์๋๋ฉด [email protected] ๊ณผ ๊ฐ์ ์ ์ ํ office365 ๊ณ์ ์ด ํ์ํฉ๋๊น?
์๋
ํ์ธ์, @attibalazs ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉ
data = requests.post(url=full_url, data=outfile, headers=options.headers, auth=options.auth)
403 ์ํ๋ฅผ ์ป์์ต๋๋ค. ์ด๋ฐ ๋ฐฉ์์ผ๋ก Sharepoint์์ ์ฐ๊ธฐ ๊ถํ์ ์ป์ผ๋ ค๋ฉด ๋ด ์ฌ๋ฌด์ค ๊ณ์ ๊ตฌ์ฑ์์ ๋ณ๊ฒฝํด์ผ ํ ์ฌํญ์ด ์์ต๋๊น?
๋ฟก ๋นต๋จ
API๋ฅผ ์ฌ์ฉํ์ญ์์ค. status = status = ctx_auth.acquire_token_for_user (username, password) ๋์ ctx_auth.acquire_token_for_app ()
ํจํค์ง๋ฅผ ์ค์นํ์ญ์์ค. pip ์ค์น -U ์ธ์ฆ์
์๋ ํ์ธ์, ์ ๋ฅผ ์ํด ์๋ํ๋ ์ฝ๋์ ๋ช ๊ฐ์ง ์กฐ์ ์ ์ถ๊ฐํ์ต๋๋ค.
Sharepoint์ ํ์ผ์ ์ ๋ก๋ํ๋ ค๊ณ ํฉ๋๋ค. ์ฌ๋ฐ๋ฅธ ๊ฒฝ๋ก์ ์์ต๋๊น?
```
def upload_file (ctx, listTitle, ๊ฒฝ๋ก) :
list_obj = ctx.web.lists.get_by_title (listTitle)
ํด๋ = list_obj.root_folder
ctx.load (ํด๋)
ctx.execute_query ()files = folder.files ctx.load(files) ctx.execute_query()
with open(path, 'rb') as f: content = f.read() file_creation_information = FileCreationInformation() file_creation_information.overwrite = True file_creation_information.url = os.path.basename(path) file_creation_information.content = content file_new = files.add(file_creation_information) ctx.load(files) ctx.execute_query()
์ธ์ฌ๋ง,
๋๋ ๋ต๋ณ์ ๋ฐ์์ผ๋ฏ๋ก ์ด๊ฒ์ ๋ซ์ ๊ฒ์ ์ ์ํฉ๋๋ค.
SharePoint ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์ผ์ ์ ๋ก๋ํ๋ ๊ถ์ฅ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
#read a local file
path = "../tests/data/SharePoint User Guide.docx"
with open(path, 'rb') as content_file:
file_content = content_file.read()
#upload it into Documents library
target_folder = context.web.lists.get_by_title("Documents").rootFolder
info = FileCreationInformation()
info.content = file_content
info.url = os.path.basename(path)
info.overwrite = True
target_file = target_folder.files.add(info)
context.execute_query()
๊ทธ๋ฌ๋ ํ์ผ์ด 2MB๋ณด๋ค ํฌ๋ฉด ํ์ผ์ ์ฒญํฌ ์งํฉ์ผ๋ก ์ ๋ก๋ํด์ผํฉ๋๋ค.
ctx = ClientContext(site_url, ctx_auth)
size_1Mb = 1000000
local_path = "./data/big_buck_bunny.mp4"
target_url = "/Shared Documents"
result_file = ctx.web.get_folder_by_server_relative_url(target_url).files.create_upload_session(local_path, size_1Mb, print_upload_progress)
ctx.execute_query()
print('File {0} has been uploaded successfully'.format(result_file.properties['ServerRelativeUrl']))
์ด๋
def print_upload_progress(offset):
print("Uploaded '{0}' bytes...".format(offset))
์ง์ ์ ๋ก๋ ์์ฒญ์ ๊ตฌ์ฑํ๋ ๊ฒ์ ์ ํธํ๋ ๊ฒฝ์ฐ @attibalazs ๋ฐ @benpolinsky์์ ์ ๊ณตํ๋ ์ค ๋ํซ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค .
๋ฐ๋ค
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@benpolinsky ์ค ๋ํซ์ ๊ฒ์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ฒ์์๋ ์์ ๋ค์ด์ ์คํธ๋ฅผ ์ป๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์์ง๋ง ๋ฐฉ๋ฒ์ ์์ ๋ด๋ฉด ํจ๊ณผ๊ฐ์์์ต๋๋ค.