Файл загружается в библиотеку SharePoint с использованием JQuery и SharePointPlus js lib только со второго клика - PullRequest
0 голосов
/ 21 октября 2019

Я использую createFile() метод библиотеки SharepointPlus 5.2 js для загрузки файла в библиотеку SharePoint 2013. Он прекрасно работает на большинстве библиотек SP. Но во вновь созданных библиотеках SP он выдает ошибку (необходимо указать содержимое файла) при первом щелчке, а затем выполняет соответствующую загрузку при втором щелчке. Как решить эту проблему?

Раздел заголовка содержит:

<script type="text/javascript" src="/_layouts/15/MicrosoftAjax.js"></script>
<script type="text/javascript" src="/_layouts/15/sp.runtime.js"></script>
<script type="text/javascript" src="/_layouts/15/sp.js"></script>
<script type="text/javascript" src="/_layouts/15/init.js"></script>
<script type="text/javascript" src="/_layouts/15/core.js"></script>
<script type="text/javascript" src="/_layouts/15/1049/strings.js"></script>
<script type="text/javascript" src="/_layouts/15/sp.ui.dialog.js"></script>
<script type="text/javascript" src="/SiteAssets/_js/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="/SiteAssets/_js/bootstrap.min.js"></script>
<script type="text/javascript" src="/SiteAssets/_js/sharepointplus-5.2.min.js"></script>

Тело HTML:

<div data-role="form" class="container form">

    <div data-field="Title">
            <label class="form_label required">Title:</label><br>
            <input class="form_field required" value=""></input>
        </div>

        <div id="fileUploadControl" > 
        <label class="form_label required">Document selection:</label><br/> 
        <input id="fileUploadInput" class="form_field" type="file"/> 
        </div>

    <hr>

    <div class="btn_panel">
        <input type="button" class="btn" id="save_btn" name="Save" value="Save" onclick="_uploadFile();"> 
        <input type="button" class="btn" id="cancel_btn" name="Cancel" value="Cancel">
    </div>

</div>

Функция JS:

function _uploadFile() {

  var Title = $('div[data-field="Title"] input').val();

  var files = document.querySelector('#fileUploadInput').files;

  files = Array.prototype.slice.call(files);
  // read the files
  Promise.all(files.map(function(file) {
    return new Promise(function(prom_res, prom_rej) {
      // use fileReader
      var fileReader = new FileReader();
      fileReader.onloadend = function(e) {
        file.content = e.target.result;
        prom_res(file);
      }
      fileReader.onerror = function(e) {
        prom_rej(e.target.error);
      }
      fileReader.readAsArrayBuffer(file);
    });
  })).then(function(files) {
    // upload files
    return Promise.all(files.map(function(file) {
      return $SP().list("8D5132D2-A458-4961-BCD6-FFD9CE964C0F").createFile({ //Doc lib UID
        content:file.content,
        filename:file.name,
        fields:{
            "Title":Title
          }
      });
    }))
  }).then(function(file) {
        alert(file[0].Name+" has been uploaded");
        console.log("Document " + file[0].Name+" has been uploaded to the Outgoing documents library");
    }, function(error) {
        console.log("Error: ",error);
    });
}

Ошибка в консоли Firefox:

необработанное исключение: [SharepointPlus 'createFile']: требуется содержимое файла.

Отладка содержимого объекта файла показывает, что онсуществует (показан размер в байтах). Обработчик ошибок не возвращает текстовое сообщение об ошибке. При втором нажатии на ту же форму (без обновления страницы) загружается файл и выдается сообщение об успехе. Я застрял, если это проблема SharePoint, JQuery или SharepointPlus, или какой-то конфликт. Обычно загрузка файла с первого клика ожидается, так как тот же код работает в других существующих библиотеках.

1 Ответ

0 голосов
/ 04 ноября 2019

Проблема решена. На самом деле проблема была не в коде, который работает нормально, а в странице iself. Несмотря на мое включение всех зависимостей SP, код работал только тогда, когда я помещал его на собственную страницу SP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...