Показаны сообщения с ярлыком File upload. Показать все сообщения
Показаны сообщения с ярлыком File upload. Показать все сообщения

вторник, 8 июля 2014 г.

SharePoint создать и загрузить текстовый файл используя JSOM & REST

У меня возникла необходимость генерировать txt и загружать его в библиотеку SharePoint.
Сам процесс аналогичен загрузке файла. Точнее ознакомиться с процессом можно по ссылке.
В коде, по ссылке выше есть метод PerformUploadInit(), один из параметров fileData можно заполнить обычной строкой, в случае текста не на латинице я получал такое отображение файла:
Проблема решилась сменой кодировки в CP-1251 из Unicode. Для смены кодировки я использовал функцию от cryo.

Конечный код решения по генерации .txt и его загрузке в библиотеку SharePoint:
var currentWebUrl;
var context;
var web;
var digest = "";
var DMap = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 34, 35: 35, 36: 36, 37: 37, 38: 38, 39: 39, 40: 40, 41: 41, 42: 42, 43: 43, 44: 44, 45: 45, 46: 46, 47: 47, 48: 48, 49: 49, 50: 50, 51: 51, 52: 52, 53: 53, 54: 54, 55: 55, 56: 56, 57: 57, 58: 58, 59: 59, 60: 60, 61: 61, 62: 62, 63: 63, 64: 64, 65: 65, 66: 66, 67: 67, 68: 68, 69: 69, 70: 70, 71: 71, 72: 72, 73: 73, 74: 74, 75: 75, 76: 76, 77: 77, 78: 78, 79: 79, 80: 80, 81: 81, 82: 82, 83: 83, 84: 84, 85: 85, 86: 86, 87: 87, 88: 88, 89: 89, 90: 90, 91: 91, 92: 92, 93: 93, 94: 94, 95: 95, 96: 96, 97: 97, 98: 98, 99: 99, 100: 100, 101: 101, 102: 102, 103: 103, 104: 104, 105: 105, 106: 106, 107: 107, 108: 108, 109: 109, 110: 110, 111: 111, 112: 112, 113: 113, 114: 114, 115: 115, 116: 116, 117: 117, 118: 118, 119: 119, 120: 120, 121: 121, 122: 122, 123: 123, 124: 124, 125: 125, 126: 126, 127: 127, 1027: 129, 8225: 135, 1046: 198, 8222: 132, 1047: 199, 1168: 165, 1048: 200, 1113: 154, 1049: 201, 1045: 197, 1050: 202, 1028: 170, 160: 160, 1040: 192, 1051: 203, 164: 164, 166: 166, 167: 167, 169: 169, 171: 171, 172: 172, 173: 173, 174: 174, 1053: 205, 176: 176, 177: 177, 1114: 156, 181: 181, 182: 182, 183: 183, 8221: 148, 187: 187, 1029: 189, 1056: 208, 1057: 209, 1058: 210, 8364: 136, 1112: 188, 1115: 158, 1059: 211, 1060: 212, 1030: 178, 1061: 213, 1062: 214, 1063: 215, 1116: 157, 1064: 216, 1065: 217, 1031: 175, 1066: 218, 1067: 219, 1068: 220, 1069: 221, 1070: 222, 1032: 163, 8226: 149, 1071: 223, 1072: 224, 8482: 153, 1073: 225, 8240: 137, 1118: 162, 1074: 226, 1110: 179, 8230: 133, 1075: 227, 1033: 138, 1076: 228, 1077: 229, 8211: 150, 1078: 230, 1119: 159, 1079: 231, 1042: 194, 1080: 232, 1034: 140, 1025: 168, 1081: 233, 1082: 234, 8212: 151, 1083: 235, 1169: 180, 1084: 236, 1052: 204, 1085: 237, 1035: 142, 1086: 238, 1087: 239, 1088: 240, 1089: 241, 1090: 242, 1036: 141, 1041: 193, 1091: 243, 1092: 244, 8224: 134, 1093: 245, 8470: 185, 1094: 246, 1054: 206, 1095: 247, 1096: 248, 8249: 139, 1097: 249, 1098: 250, 1044: 196, 1099: 251, 1111: 191, 1055: 207, 1100: 252, 1038: 161, 8220: 147, 1101: 253, 8250: 155, 1102: 254, 8216: 145, 1103: 255, 1043: 195, 1105: 184, 1039: 143, 1026: 128, 1106: 144, 8218: 130, 1107: 131, 8217: 146, 1108: 186, 1109: 190};

function GenerateAndUploadTXTFileToSharePointLibrary(library,fileName,folder,content){
 var enodedContent = UnicodeToWin1251(content);
 PerformUpload(library,fileName,folder,content);
}

function UnicodeToWin1251(s) {
    var L = []
    for (var i=0; i&lts.length; i++) {
        var ord = s.charCodeAt(i)
        L.push(String.fromCharCode(DMap[ord]))
    }
    return L.join('')
}

function PerformUpload(libraryTitle, fileName, folderTitle, content) {

    var reqExecutor = new SP.RequestExecutor(currentWebUrl);
    var url = "/registry/_api/web/GetFolderByServerRelativeUrl('" + libraryTitle + "/" + folderTitle + "')/Files/add(url='" + fileName + "', overwrite=true)";
    reqExecutor.executeAsync({
        url: url,
        method: "POST",
        headers: {
            //"Accept": "application/json; odata=verbose",
            "X-RequestDigest": digest
        },
        binaryStringRequestBody: true,
        body: content,
        success: function () {
            console.log("Файл удачно загружен.");
        },
        error: function (x, y, z) {
            alert(x); alert(y); alert(z);
            console.log("Не удалось загрузить файл.");
        }
    });
}

function getWebProperties() {
    console.log("Начало выполнения функции 'getWebProperties()'");
    context = SP.ClientContext.get_current();
 web = context.get_web();
 list = web.get_lists();
    context.load(web, 'ServerRelativeUrl');
    context.executeQueryAsync(
 function () {
     console.log("Удалось получить текущий url сайта");
     currentWebUrl = web.get_serverRelativeUrl();
 },
 function () {
     console.log("Не удалось получить текущий url сайта");
 }
   );
}

function myOnload() {
 $.getScript("/_layouts/15/SP.RequestExecutor.js", function (){});
 digest = $("#__REQUESTDIGEST").val();
 getWebProperties();
}

_spBodyOnLoadFunctionNames.push("myOnload");

Пример вызова:
GenerateAndUploadTXTFileToSharePointLibrary('documentLibraryTitle','fileName.txt','folderTitle','Слово');

понедельник, 28 апреля 2014 г.

SharePoint custom file uploader by JSOM & REST\oData

SharePoint имеет встроенную возможность прикреплять файлы к элементам списка.

Но нет возможности иметь 2 поля. Что бы логически разделять документы.
Такого столбца просто нет в списке.
Так же нет возможности задать библиотеку, куда складывать вложения.
Что бы просмотреть вложенные элементы, необходимо открыть элемент списка.
Решением может быть создание своего custom field type.
Использовать серверный код для реализации функционала. В таком случае ограничений почти нет.
Можно купить. Есть несколько предложений на рынке.
Я же кратко покажу как добавить такой функционал без серверного кода.
Решение должно иметь возможность явно указать библиотеку, куда складывать файлы.
Не блокировать интерфейс на время загрузки.
Иметь возможность загрузки файлов большого размера.
Решение должно сразу же отображать загруженный файл и предоставлять возможность его удаления.
Все должно быть без постбэков.
Все будет сделано на JavaScript.

Для начала создайте новую форму просмотра.
Это можно сделать в SharePoint Designer.
Имя папки для хранения файлов- "Documents".
Библиотека указывается в html элементе для загрузки файлов:
onchange="UploadFile('Documents', 'fileinputInit')"
Добавьте в нее html:
<tr> 
    <td width="190px" valign="top" class="ms-formlabel"> 
        <h3 class="ms-standardheader"> 
            <nobr>Документы по открытию</nobr> 
        </h3> 
    </td> 
    <td width="400px" valign="top" class="ms-formbody"> 
        <input style="margin-left:2px" type="button" id="browseButton" value="Добавить файл ..." onclick="fileinputInit.click()" />
        <input type='file' id='fileinputInit' onchange="UploadFile('Documents', 'fileinputInit')" style='position:absolute;visibility:hidden;' multiple="multiple" /> 
        <div id="attachedFilesInit"> 
            <h2 id="initAnchor"></h2> 
        </div> 
    </td>
</tr> 
Этот html надо вставить в таблицу полями формы.
Что бы поле загрузки располагалось после поле "Название", вставьте код выше после указанного ниже:
    <td width="190px" valign="top" class="ms-formlabel"> 
        <h3 class="ms-standardheader"> 
            <nobr> 
                Название<span class="ms-formvalidation"> *</span> 
            </nobr> 
        </h3> 
    </td> 
    <td width="400px" valign="top" class="ms-formbody"> 
        <SharePoint:FormField runat="server" id="ff1{$Pos}" ControlMode="New" FieldName="Title" __designer:bind="{ddwrt:DataBind('i',concat('ff1',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Title')}" /> 
        <SharePoint:FieldDescription runat="server" id="ff1description{$Pos}" FieldName="Title" ControlMode="New" /> 
    </td> 
</tr>
 Потом добавить после:

Этот JS




Решение работает асинхронно.
Загрузки делалась именно с помощью REST, т.к. JSOM имеет ограничение файла на загрузку в 2 Mb.

В результате у Вас должно быть как на гиф ниже:

Решение есть куда дорабатывать.
Для начала отключить возможность сабмита формы, на время загрузки.
И индикатор загрузки в список файлов.