http://www.shillier.com/archive/2013/03/26/uploading-files-in-sharepoint-2013-using-csom-and-rest.aspx

 

Recently, I have been working through the process of trying to accomplish as many basic SharePoint tasks with both CSOM and REST as possible. My goal is to build a deeper understanding of what operations work in both approaches as well as strengths and limitations. In the case of document uploading, the CSOM approach is only good for files up to 1.5MB whereas REST is good up to 2GB. This makes understanding the REST approach critical, but I was struggling to get it working using the jQuery ajax method because the documentation is not great. In this post, I’ll save you the heartache I went through and just show you how to do it in both approaches.

Selecting Files

The first thing to set up is the control used for selecting files from the web page. This is a pretty simple use ofinput controls:

<input id="inputFile" type="file" />

<input id="uploadDocumentButton" type="Button" value="Upload Document"/>

The inputFile control allows for the browsing and selecting of files. The uploadDocumentButton control initiates the upload process. The inputFile control has a Files collection that you can use to access the file for uploading. The following code shows how to get the filename and file for uploading.

$("#uploadDocumentButton").click(function () {

if (document.getElementById("inputFile").files.length === 0) {

alert("Select a file!");

return;

}

var parts = document.getElementById("inputFile").value.split("\\");

var filename = parts[parts.length - 1];

var file = document.getElementById("inputFile").files[0];

}

Reading Files

Once the file is selected, you have to read the bytes into your JavaScript code. This is accomplished using theFileReader object. This object accepts the file information for loading asynchronously. The onload and onerrorevents fire when the file is loaded successfully or fails. I wrote a helper function using promises to read the file into an ArrayBuffer, which will be used later during the upload.

var getFileBuffer = function (file) {

var deferred = $.Deferred();

var reader = new FileReader();

reader.onload = function (e) {

deferred.resolve(e.target.result);

}

reader.onerror = function (e) {

deferred.reject(e.target.error);

}

reader.readAsArrayBuffer(file);

return deferred.promise();

};

Uploading with CSOM

Uploading the file with CSOM requires converting the ArrayBuffer to a Base64-encoded array, which is then put into a SP.FileCreationInformation object. The following code shows a complete library for uploading with CSOM.

"use strict";

var WingtipToys = window.WingtipToys || {};

WingtipToys.Jsom = WingtipToys.Jsom || {};

WingtipToys.Jsom.Libs = function () {

var deferreds = new Array(),

upload = function (serverRelativeUrl, filename, file) {

deferreds[deferreds.length] = $.Deferred();

getFileBuffer(file).then(

function (buffer) {

var bytes = new Uint8Array(buffer);

var content = new SP.Base64EncodedByteArray(); //base64 encoding

for (var b = 0; b < bytes.length; b++) {

content.append(bytes[b]);

}

var ctx = new SP.ClientContext.get_current();

var createInfo = new SP.FileCreationInformation();

createInfo.set_content(content); //setting the content of the new file

createInfo.set_overwrite(true);

createInfo.set_url(filename);

this.files = ctx.get_web().getFolderByServerRelativeUrl(serverRelativeUrl).get_files();

ctx.load(this.files);

this.files.add(createInfo);

ctx.executeQueryAsync(

Function.createDelegate(this,

function () { deferreds[deferreds.length - 1].resolve(this.files); }),

Function.createDelegate(this,

function (sender, args) { deferreds[deferreds.length - 1].reject(sender, args); }));

},

function (err) {

deferreds[deferreds.length - 1].reject(err);

}

);

return deferreds[deferreds.length - 1].promise();

},

getFileBuffer = function (file) {

//See previous code

};

return {

upload: upload,

};

}();

Once the library is written, uploading the file becomes pretty simple. For this example, I am assuming a document library named “JSOM Documents” exists. Notice how the server-relative URL is provided to the upload method.

WingtipToys.Jsom.Libs.upload("/apps/LibraryOperations/JSOM%20Documents", filename, file)

.then(

function (files) {

alert("Uploaded successfully");

},

function (sender, args) {

alert(args.get_message());

}

);

Uploading with REST

The REST approach can use the contents of the ArrayBuffer directly. The key to making this approach work with jQuery ajax is to set the processData flag to false. By default, jQuery ajax will process all non-string data into a query string, which corrupts the binary file data during the upload. By setting it to false, the data is faithfully uploaded. The following code shows a complete library for uploading with REST.

"use strict";

var WingtipToys = window.WingtipToys || {};

WingtipToys.Rest = WingtipToys.Rest || {};

WingtipToys.Rest.Libs = function () {

var upload = function (serverRelativeUrl, filename, file) {

var deferred = $.Deferred();

getFileBuffer(file).then(

function (arrayBuffer) {

$.ajax({

url: _spPageContextInfo.webServerRelativeUrl +

"/_api/web/GetFolderByServerRelativeUrl('" + serverRelativeUrl + "')/Files" +

"/Add(url='" + filename + "', overwrite=true)",

type: "POST",

data: arrayBuffer,

processData: false,

headers: {

"accept": "application/json;odata=verbose",

"X-RequestDigest": $("#__REQUESTDIGEST").val(),

"content-length": arrayBuffer.byteLength

},

success: function (data) {

deferred.resolve(data);

},

error: function (err) {

deferred.reject(err);

}

});

},

function (err) {

deferred.reject(err);

}

);

return deferred.promise();

},

getFileBuffer = function (file) {

//See previous code

};

return {

upload: upload

};

}();

Again, once you have the library, uploading the file is easy. Here is the REST version of the upload method.

WingtipToys.Rest.Libs.upload("/apps/LibraryOperations/REST%20Documents", filename, file)

.then(

function (data) {

alert("Uploaded successfully");

},

function (err) {

alert(JSON.stringify(err));

}

);

Conclusions

As with most things in programming, it’s pretty simple when someone shows you how. Sparse documentation on MSDN, however, gave me a couple of days of agony. (I'll probably get a laugh when a reader points me at a full code sample somehere on MSDN that I missed.)

The big takeaway from this effort is that now you can easily use the REST interface for file uploading, which is good for files up to 2GB. Because CSOM is limited to 1.5MB, it seems like there is really little point to using anything but REST.

Uploading Files in SharePoint 2013 using CSOM and REST的更多相关文章

  1. SharePoint 2013 开发——CSOM概要

    博客地址:http://blog.csdn.net/FoxDave 本篇对客户端API做一个大致地了解. 看一下各个类别主要API之间的对应关系表. 假设我们对Server API已经有了足够地了 ...

  2. How to copy files between sites using JavaScript REST in Office365 / SharePoint 2013

    http://techmikael.blogspot.in/2013/07/how-to-copy-files-between-sites-using.html I'm currently playi ...

  3. 解决SharePoint 2013 designer workflow 在发布的报错“负载平衡没有设置”The workflow files were saved but cannot be run.

    原因是app management service没有设置好,在管理中心把他删掉,重新建一个就可以了 Provision App Management Service In SharePoint 20 ...

  4. SharePoint 2013 开发——搜索架构及扩展

    博客地址:http://blog.csdn.net/FoxDave SharePoint 2013高度整合了搜索引擎,在一个场中只有一个搜索服务应用程序(SSA).它集成了FAST,只有一个代码库 ...

  5. SharePoint 2013的100个新功能之开发

    一:SharePoint应用 SharePoint 2013引入了云应用模型来供用户创建应用.SharePoint应用是独立的功能整合,扩展了SharePoint网站的功能.应用可以包含SharePo ...

  6. 实现一个基于 SharePoint 2013 的 Timecard 应用(中)

    门户视图 随着 Timecard 列表的增多,如何查找和管理这许多的 Timecard 也就成了问题.尤其对于团队经理而言,他除了自己填写的 Timecard,还要审核团队成员的 Timecard 任 ...

  7. 实现一个基于 SharePoint 2013 的 Timecard 应用(上)

    在 SharePoint 2013 上面实现一个 Timecard 应用的想法来自一个真实的需求,而实现的方案在我脑海里面盘旋已经很久了,终于这几天准备安排点儿时间将它实现出来. “ We start ...

  8. Integrating SharePoint 2013 with ADFS and Shibboleth

    Time again to attempt to implement that exciting technology, Federation Services (Web Single Sign On ...

  9. office 365 Sharepoint 2013

    平台环境: office 365 Sharepoint  2013 操作文件和文件夹 访问文档库的最佳方式是借助在 /_api/web 处可用的 GetFolderByServerRelativeUr ...

随机推荐

  1. wndbg下载与安装

    wndbg分X86和X64两个版本 如果你的程序是32位的,就下载安装X86的版本:如果你的程序是64位,就下载X64版本. x86位版本下载:[微软官方安装版] x64位版本下载:[微软官方安装版]

  2. js apply/call/caller/callee/bind使用方法与区别分析

    一.call 方法 调用一个对象的一个方法,以另一个对象替换当前对象(其实就是更改对象的内部指针,即改变对象的this指向的内容). Js代码 call([thisObj[,arg1[, arg2[, ...

  3. Linux高级编程--04.GDB调试程序(查看数据)

    查看栈信息 当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的.当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入"栈"(Stack)中.你可以用 ...

  4. excel导入记录

    use DangJianSELECT vale1, value2 into Table2 from Table1 select COUNT(*) from tmpdangyuan where 手机号 ...

  5. 使用ELK(Elasticsearch + Logstash + Kibana) 搭建日志集中分析平台实践--转载

    原文地址:https://wsgzao.github.io/post/elk/ 另外可以参考:https://www.digitalocean.com/community/tutorials/how- ...

  6. iOS-验证码倒计时60秒

    一. 要求 1.点击获取验证码按钮,60秒倒计时,按钮变成不可点击状态,按钮文字变成倒计时的秒数. 2.当倒计时为0的时候,释放掉定时器NSTimer,按钮变成可以点击状态,按钮文字变成"获 ...

  7. 3 Servlet监听器

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 1. ServletConfig和ServletContext 1.1 ServletConfig和Servle ...

  8. css优先级和层叠

    css优先级和层叠 1.优先级    计算方法:        a.行内样式        b.id选择器的数量        c.类,伪类和属性选择器的数量        d.标签选择器和伪元素选择 ...

  9. 优化C/C++代码的小技巧

    说明: 无意看到一篇小短文,猜测作者应该是一个图形学领域的程序员或专家,介绍了在光线(射线)追踪程序中是如何优化C/C++代码的.倒也有一些参考意义,当然有的地方我并不赞同或者说我也不完全理解,原文在 ...

  10. elasticsearch配置

    配置文件详解1.0版 配置文件位于es根目录的config目录下面,有elasticsearch.yml和logging.yml两个配置,主配置文件是elasticsearch.yml,日志配置文件是 ...