Как скопировать файл с помощью Rest API и javascript в Sharepoint 2013 между сайтом и дочерним сайтом

Мне нужно скопировать файл между библиотеками документов. Библиотека A расположена на одном сайте, а библиотека B — на дочернем сайте. Я знаю, как копировать файл между библиотеками на одном уровне, но проблема заключается в копировании между разными уровнями.

Код, который я использую для копирования файла между библиотеками на одном уровне.

 $.ajax({
     url : "http://xxx/PWA/_api/web/folders/GetByUrl('/PWA/CopyFromLibrary')/Files/getbyurl('Import.csv')/copyTo(strNewUrl = '/PWA/TargetLibrary/Import.csv',bOverWrite = true)",

method: 'POST',
    headers: {
        "Accept": "application/json; odata=verbose",
        "X-RequestDigest":  $("#__REQUESTDIGEST").val()
    },
    success: function () {
        alert("Success! Your file was copied properly");
    },
    error: function () {
        alert("Problem with copying");
    }
    });

Для другого уровня я использую просто другой целевой URL:

url : "http://xxx/PWA/_api/web/folders/GetByUrl('/PWA/CopyFromLibrary')/Files/getbyurl('Import.csv')/copyTo(strNewUrl = '/PWA/Subsite/TargetLibrary/Import.csv',bOverWrite = true)",

И это не работает. Как обойти эту проблему?


person qw141    schedule 05.06.2013    source источник


Ответы (5)


Только что понял это сегодня для межсайтового решения. Хитрость в том, что не используйте $.ajax для загрузки документа. Используйте старый добрый XMLHttpRequest. Причина в том, что JQuery просто не позволяет получить необработанный массив двоичных данных из SharePoint. Но XMLHttpRequest делает это, потому что он позволяет вам получить буфер массива как часть его реализации, которую принимает SharePoint!

Ниже приведен код с частями, определенными для создания полного исходного и целевого URL-адресов REST. Обратите внимание, что вы можете использовать $.ajax для загрузки файла.

  • sourceSite – это сайт SharePoint, на котором можно добавить конечную точку _api.
  • sourceFolderPath – это относительный путь к папке, в которой находится ваш документ.
  • sourceFileName – это имя файла документа.
  • targetSite, targetFolderPath и targetFileName являются зеркальными изображениями или источником только для места назначения.
  • requestDigest — это специальное значение, необходимое для того, чтобы SharePoint принимал обновления.

    function copyDocument(sourceSite, sourceFolderPath, sourceFileName, targetSite, targetFolderPath, targetFileName, requestDigest) {
    
        var sourceSiteUrl = sourceSite + "_api/web/GetFolderByServerRelativeUrl('" + sourceFolderPath + "')/Files('" + sourceFileName + "')/$value";
        var targetSiteUrl = targetSite + "_api/web/GetFolderByServerRelativeUrl('" + targetFolderPath + "')/Files/Add(url='" + targetFileName + "',overwrite=true)";
    
        var xhr = new XMLHttpRequest();
        xhr.open('GET', sourceSiteUrl, true);
        xhr.setRequestHeader('binaryStringResponseBody', true);
        xhr.responseType = 'arraybuffer';
        xhr.onload = function (e) {
            if (this.status == 200) {
                var arrayBuffer = this.response;
                $.ajax({
                    url: targetSiteUrl,
                    method: 'POST',
                    data: arrayBuffer,
                    processData: false,
                    headers: { 'binaryStringRequestBody': 'true', 'Accept': 'application/json;odata=verbose;charset=utf-8', 'X-RequestDigest': requestDigest }
                })
                .done(function (postData) {
                console.log('we did it!');
                })
                .fail(function (jqXHR, errorText) {
                console.log('dadgummit');
            });
            }
        }
        xhr.send();
    }
    
person John Milan    schedule 12.08.2016
comment
Спасибо сработало!!! :) . Я долго искал его :). Еще 1 вещь, если значение requestDigest было бы $(#__REQUESTDIGEST).val() - person Adi; 20.09.2016
comment
Каким должен быть синтаксис для получения requestDigest с правильным значением? - person Mark; 07.11.2019
comment
Он не справляется со всеми свойствами документа, есть ли для этого какое-либо исправление? - person Manveer Singh; 29.10.2020

Какую ошибку вы получаете?

Одна из вероятных причин вашей проблемы заключается в том, что ваш RequestDigest не соответствует местоположению, в которое вы хотите отправить файл POST, поскольку он получен со страницы, на которой выполняется ваш код. Получите соответствующий RequestDigest, вызвав «_api/contextinfo» в целевом местоположении.

См.: http://blogs.breeze.net/mickb/2012/11/20/SP2013GettingAFormDigestForUpdateRESTCalls.aspx и http://msdn.microsoft.com/en-us/magazine/dn198245.aspx (запись в раздел Sharepoint)

person PowerSupply    schedule 19.06.2013

Примечание. Операции перемещения файлов работают только в рамках данной библиотеки документов. Вы не можете копировать между библиотеками документов.

http://msdn.microsoft.com/en-us/library/office/dn605900%28v=office.15%29.aspx#Folder6

person kannan    schedule 17.04.2014

Для операции POST нам нужно значение дайджеста запроса, которое используется SharePoint для аутентификации в основном для публикации, удаления, обновления, не требуется для операции GET, пример кода jquery ajax для операции публикации.

 $.ajax({
        url: url + "/_api/web/lists/getbytitle('" + listname + "')/items",
        type: "POST",
        contentType: "application/json;odata=verbose",
        data: JSON.stringify(item),
        headers: {
            "Accept": "application/json;odata=verbose",
            "X-RequestDigest": $("#__REQUESTDIGEST").val()
        },
        success: function (data) {
            success(data); // Returns the newly created list item information
        },
        error: function (data) {
            failure(data);
        }
    });
person Vinod kumar G    schedule 10.08.2017

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

Следующий пример будет полезен при копировании файлов в изолированной программной среде SharePoint.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<div ng-app="myapp" ng-controller="mycont">
    <input type="button" ng-click = "myclick()" value="Angular File Copy" />    
</div>

<input type=button onclick="x()"  value="jQueryFile copy" />
<script>
    var dt =new Date();
    var val_ue = dt.getDate()+""+dt.getHours()+""+dt.getMinutes()+""+dt.getSeconds() +"1" ;
    var url1 = "/_api/web/getfilebyserverrelativeurl('/Lists/Document_Mapping/Attachments/1/9.jpg')";
    var url2 = "/Lists/AddressVersioning/Attachments/84/" ;
    var combined = "";
    var app = angular.module('myapp',[]);
    var _headers = {
        'X-RequestDigest': document.getElementById("__REQUESTDIGEST").value,
        'accept':'application/json;odata=verbose'
    };
    app.controller('mycont',function($scope,$http){
        $scope.myclick =  function(){
            combined = url1 + "/copyTo('" + url2 + val_ue + ".jpg')";
            $http({method:'POST',url:combined,headers:_headers}).then(
                function(response){
                    console.log("hi");
                    val_ue += 1;
                },
                function(error){
                    console.log("Error:");
                    console.log(error);
                },
                function(process){
                    console.log("process:");
                    console.log(process);
                }
            );
        }
    });
    var x = function(){
        combined = url1 + "/copyTo('" + url2 + val_ue + ".jpg')";
        $.ajax({
            url : combined,
            method: 'POST',
            headers: {
                "Accept": "application/json; odata=verbose",
                "X-RequestDigest":  $("#__REQUESTDIGEST").val()
            },
            success: function () {
                alert("Success! Your file was copied properly");
                val_ue +=1;
            },
            error: function () {
                alert("Problem with copying");
            }
        });
    }
</script>

Примечание: приведенная выше функция не будет работать, если элемент списка создан заново. Но для всех других ситуаций это будет работать (даже преобразование одной библиотеки документов в другую библиотеку документов или кросс-сайт/коллекция сайтов)

person George Livingston    schedule 09.02.2018