Блог

    Caché (Кашэ́) — промышленная высокопроизводительная, объектная система управления базами данных, интегрированная с технологией разработки веб-приложений. Единая архитектура данных Caché позволяет разработчикам использовать одновременно объектный, реляционный (SQL) и прямой (NoSQL) доступ к одним и тем же данным, хранение которых обеспечивается ориентированным на транзакции многомерным ядром СУБД.

    http://www.intersystems.ru/cache/

Последние записи


Теги

Информация

$(REST - CSP - (-HyperEvents) + EasyUI + File Upload). Часть 3

добавлено: 08 июл 15
понравилось:0
просмотров: 940
комментов: 0

теги:

Автор: servit

..Но сперва рассмотрим обработку ошибок.

Создадим обычный метод SrvError:
XData UrlMap [ XMLNamespace "http://www.intersystems.com/urlmap" ]
{
<
Routes>
  <
Route Url="/error" Method="POST" Call="SrvError"/>
  <
Route Url="/:hyperevent" Method="POST" Call="RestHyperEvent"/>
  <
Route Url="/" Method="GET" Call="MainPage"/>
  <
Route Url="/(.*)" Method="GET" Call="StaticFiles"/>
</
Routes>
}

ClassMethod SrvError() As %Status
{
  
q $$$ERROR($$$GeneralError,"Наш текст ошибки из Caché")
}
и поменяем вызов у кнопки:
  <button onclick="$.ajax({url: 'error'})">Нажми меня</button>
Теперь если её нажать, мы увидим сообщение "Internal Server Error", то есть возвращается код 500, но нам этого вовсе недостаточно, мы ведь хотим видеть полную информацию об ошибке: код, текст, ФИО разработчика.
Для этого изменим соответствующий обработчик:
...
  405function() {alert('Метод запрещён')},
  
500function(jqXHR,textStatus,errorThrown) {alert($.toJSON(jqXHR.responseJSON,null,2))}
...
Теперь всё видно, а что нельзя видеть - не видно.
Кстати, ошибку можно генерировать по-разному - t=5/0 или throw - на клиент в любом случае придёт полная информация об ошибке.

Теперь к обещанному, но сначала..

Получение с сервера кода JS для выполнения на клиентской стороне


Тут всё просто.

Добавим новый метод и обновим кнопку:
<Route Url="/js" Method="POST" Call="SrvGetJS"/>

ClassMethod SrvGetJS() As %Status
{
  
%response.ContentType="text/javascript"
  
&js<alert('Привет с сервера');>
  
q $$$OK
}

<button onclick="$.ajax({url:'js',dataType:'script'})">Нажми меня</button>

Интеграция с jQuery File Upload


Многочисленные примеры на нашем форуме в основном были рассчитаны на загрузку файла с перезагрузкой страницы, что по нынешним временам... Но зато работает.
Мир не стоит на месте, в том числе и стандарт HTML, поэтому было создано множество плагинов по исправлению данной ситуации. Одним из таких плагинов, основанном на jQuery, является jQuery File Upload.
Он довольно хорошо описан, поэтому просто последуем документации:

1) библиотеки у нас уже подключены;
2) добавим метод в карту путей и собственно сам метод
XData UrlMap [ XMLNamespace "http://www.intersystems.com/urlmap" ]
{
<
Routes>
  <
Route Url="/error" Method="POST" Call="SrvError"/>
  <
Route Url="/js" Method="POST" Call="SrvGetJS"/>
  <
Route Url="/upload" Method="POST" Call="SrvUpload"/>

  <
Route Url="/:hyperevent" Method="POST" Call="RestHyperEvent"/>

  <
Route Url="/" Method="GET" Call="MainPage"/>
  <
Route Url="/(.*)" Method="GET" Call="StaticFiles"/>
</
Routes>
}

ClassMethod SrvUpload() As %Status
{
  
#dim %request As %CSP.Request
  
#dim stream As %CSP.BinaryStream

  
if (%request.IsDefinedMimeData("files[]",1) ) {
    
    
stream=%request.GetMimeData("files[]")
    
    
file=##class(%Stream.FileBinary).%New()
    
file.Filename="c:\Temp\"_stream.FileName
    d 
file.CopyFromAndSave(stream)
    
    
tmp=##class(%ZEN.proxyObject).%New()
    
tmp.name=stream.FileName
    s 
tmp.size=stream.Size
    s 
tmp.type=stream.ContentType

    s 
list=##class(%ListOfDataTypes).%New()
    
list.Insert(tmp)

    
r=##class(%ZEN.proxyObject).%New()
    
r.files=list
    
    
r.%ToJSON("aelo")
  
}
  
q $$$OK
}
Примечание:
Сервер по окончании операции должен вернуть json-ответ, как прошло сохранение. Здеcь возможны варианты.
3) добавим кнопку
...
<button onclick="$.ajax({url:'js',dataType:'script'})">Нажми меня</button>
<
input id="fileupload" type="file" name="files[]" data-url="upload" multiple data-sequential-uploads="false">
...
4) повесим на неё обработчик. Лучше всего это сделать по завершении загрузки страницы, поэтому обновим наш метод WriteCommonJS:
...
})(jQuery);

$(function(){
  $(
'#fileupload').fileupload();
});

</
script>>
...
5) если сейчас на страничке попробовать выбрать файл или файлы, то тут же произойдёт вызов метода на сервере, но в каталог c:\Temp\ ничего не запишется.

Это происходит потому, что мы пытаемся преобразовать тело запроса из json в строку. Для метода upload нужно сделать исключение.
Исправим это:
...
beforeSend: function(jqXHR,settings) {
  
if (settings.url!='upload') {settings.data=$.toJSON(settings.data);} // перед отсылкой конвертируем json-объект в json-строку кроме upload
},
...
Теперь всё должно работать как положено.

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

В следующей (3a[ключительной]) части мы коснёмся интеграции в наше rest-приложение одного из UI-фреймворков, но сперва..

Комментарии




Необходимо войти на сайт, чтобы оставлять комментарии