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

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

Мы начинаем с создания двух HTTP-клиентов и по одному HTTP-запросу в каждом из них:

Первый HTTPRequest (HTTPClient1) получает список файлов, которые необходимо загрузить. Думайте об этом, как о том, как зайти на сервер вашего приложения и узнать, что нужно скачать.

В демо, которое я сделал, я получил список из 5 файлов с https://sample-videos.com, в которых есть изображения разных размеров, и они отлично подходят для любых целей тестирования. У них также есть несколько типов файлов для тестирования, например видео, файлы PDF, Zip и другие.

Поэтому я сделал короткий json-файл, содержащий URL-адреса этих файлов, и разместил его в Интернете здесь: https://dont-be-a-tourist.firebaseio.com/files.json

Теперь я просто указываю HTTPClient1 на https://dont-be-a-tourist.firebaseio.com, а Request1 на /files.json. Не забудьте получить вместо публикации по умолчанию.

Хорошо, следующим шагом будет глобальное сохранение этих значений, поэтому мы создаем сигнал загрузки.

Щелкните объект Window1 и создайте объект массива файлов, назовем его fArr.

Если вы не знаете, как это сделать, нажмите Window1 и нажмите кнопку «Инспектор кода» в правом верхнем углу:

Теперь в разделе свойств нажмите кнопку +, чтобы создать новое свойство, и назовите его fArr (автоматически переименовывается в _fArr), но не беспокойтесь об этом.

Просто щелкните свойство правой кнопкой мыши и выберите «Преобразовать в вычисляемое свойство».

И теперь у вас есть преобразованная собственность с собственным именем.

Хорошо, если вы нажмете «Играть сейчас», ничего не произойдет. Это потому, что даже если у нас есть HTTPClient, мы на самом деле его не выполняем.

Давай исправим это.

Щелкните Window1 ›Events› DidShow и введите следующий код:

HTTPClient1.Request1.run();
fArr = [];

Что мы делаем с этим кодом, так это то, что мы сообщаем Creo, что когда появится Window1, выполните HTTPClient1 (загрузите список файлов) и инициируйте fArr как массив, чтобы мы могли сохранить значения файлов, которые хотим загрузить.

Хорошо, теперь список файлов будет приходить через HTTPClient1, но после этого ничего не происходит. Давай изменим это.

Откройте HTTPClient1 ›Request1 и выберите Events› DidFinish.

Что мы сделаем, так это получим значения для файлов, которые мы хотим загрузить, и сохраним их в fArr следующим образом:

var json = self.value;
for (var f in json){
 var url = f.url;
 fArr.push(url);
}

self.value - это значение, которое мы получаем от HTTPRequest1, который является выходом json.

Затем мы запускаем цикл для значений в json. Нам нужен только URL-адрес, а не весь JSON.

Вот что я имею в виду. На выходе получается массив объектов:

[{"url":"https://sample-videos.com/img/Sample-jpg-image-1mb.jpg"},{"url":"https://sample-videos.com/img/Sample-jpg-image-2mb.jpg"},{"url":"https://sample-videos.com/img/Sample-jpg-image-5mb.jpg"},{"url":"https://sample-videos.com/img/Sample-jpg-image-10mb.jpg"},{"url":"https://sample-videos.com/img/Sample-jpg-image-500kb.jpg"}]

Когда мы выполняем var f в json, мы получаем каждое значение отдельно, которое является объектом:

{"url":"https://sample-videos.com/img/Sample-jpg-image-1mb.jpg"}

Если мы хотим загрузить файл, нам нужен только URL-адрес, а не объект, поэтому мы объявляем var url = f.url, что фактически дает нам только URL-адрес:

Https://sample-videos.com/img/Sample-jpg-image-1mb.jpg

Хорошо, у нас есть URL-адрес файла, теперь давайте поместим его в очередь:

fArr.push(url);

Здорово. После завершения цикла for у нас появляется очередь файлов.

Теперь нам нужно начать загрузку.

Для этого нам понадобится пара вещей:

  1. Файлы должны находиться на одном сервере, так как HTTPClient2 должен быть настроен на определенный URL (хотя это может быть неверно, поскольку вы можете управлять свойством url HTTPClient, но я это не тестировал).
  2. Задайте свойство пути HTTPClient2.Request1 и выполните запрос.

Хорошо, так что продолжайте и добавьте HTTPClient2 с URL-адресом вашего домена, в котором вы храните файлы (в данном примере это https://sample-videos.com/).

Затем добавьте пустой Request1 без пути, получить как метод и изображение как сериализатор:

Хорошо, если вы это протестируете, это не сработает, так как мы будем заполнять его динамически.

Идея состоит в том, что этот объект получит значение из очереди fArr, загрузит его, удалит файл из очереди и сделает это снова, пока не закончатся файлы.

Да, и нам также понадобится один объект FileManager и один ImageView, поэтому просто перетащите их в Window1.

Как упоминалось ранее, HTTPClient2.Request1 не имеет пути, поэтому нам нужно вернуться к нашему первому запросу (HTTPClient1.Request1), чтобы заполнить его и инициировать первую загрузку.

Итак, щелкните HTTPClient1.Request1 ›DidFinish и добавьте туда дополнительный код:

var lastEl = fArr.count;
var l = fArr[lastEl-1]
Console.write(l)
var fPath = l.replace('https://sample-videos.com/','');
Console.write(fPath)
HTTPClient2.Request1.path = fPath;
HTTPClient2.Request1.run()

Мы получаем последний элемент в нашей очереди, заменяем URL-адрес, чтобы остался только путь, мы сообщаем HtTPClient2.Request1 путь, и запускаем HTTPClient2.Request1 с помощью метода .run ().

Вот как выглядит окончательный код для события HTTPClient1.Request1 DidFinish:

Наша первая загрузка началась! Теперь нам нужно сохранить его, удалить из очереди и начать следующую загрузку.

Откройте событие HTTPClient2.Request1 DidFinish.

Чтобы сохранить файл, нам нужно имя файла. Мы можем получить это с помощью метода self.path и некоторых манипуляций со строкой.

Console.write(self.path)
var p = self.path;
var fnarr = p.split('/');
var fnarrlen = fnarr.count - 1;
var fname = fnarr[fnarrlen];
Console.write('fname = \(fname)');

Чтобы получить данные файла самостоятельно, мы используем метод self.value. Но чтобы сохранить его, нам нужно представить его в виде изображения:

var image = self.value;
var data = image.JPEGRepresentation(0.8);

После этого сохраним:

var documentsPath = FileManager.directory(SearchPath.Documents);
var filePath = FileManager.appendPath(documentsPath,fname)
var f = FileManager1.createFile(filePath, data);

Чтобы увидеть загруженный файл, мы можем присвоить значение ImageView, которое мы поместили на холст:

ImageView1.image = self.value;

Хорошо, мы загрузили файл, сохранили его и отобразили в ImageView.

Теперь нам нужно получить следующий файл в очереди и проделать это заново:

if (fArr.count!=0 ){
 var photo = fArr.pop();
 self.path = photo;
 self.run();
} else {
 Console.write('No files in queue')
}

Проверяем, есть ли еще файлы в очереди, с помощью метода count. Если файлов больше, мы получаем следующий файл, используя метод pop (который также удаляет файл из очереди). Мы сообщаем запросу, что путь является свойством фотографии, и запускаем запрос.

Магия! Теперь он работает для всех файлов!

Вот последний код для события HTTPClient2.Request1 DidFinish:

Console.write('Download finished');
Console.write(self.path)
var p = self.path;
var fnarr = p.split('/');
var fnarrlen = fnarr.count - 1;
var fname = fnarr[fnarrlen];
Console.write('fname = \(fname)');
var image = self.value;
var data = image.JPEGRepresentation(0.8);
var documentsPath = FileManager.directory(SearchPath.Documents);
var filePath = FileManager.appendPath(documentsPath,fname)
var f = FileManager1.createFile(filePath, data);
ImageView1.image = self.value;
if (fArr.count!=0 ){
 var photo = fArr.pop();
 self.path = photo;
 self.run();
} else {
 Console.write('No files in queue')
}

И вот как это выглядит, когда мы его запускаем:

Вот и файл Creo:

Https://www.dropbox.com/s/3ub3skkh48yu3ro/demo-file-downloader.creoproject.zip?dl=0