Серверный JavaScript 1.4. Руководство по использованию

       

Работа с Двоичными/Бинарными Данными


Двоичные данные для мультимедиа-содержимого, такого как изображение или звуковой файл, хранятся в БД в виде большого двоичного объекта/binary large object (BLOb). Можно использовать технику двух видов для обработки бинарных данных в приложениях JavaScript:

  • Хранить имена файлов в БД, а данные - в отдельных файлах.

  • Хранить данные в БД как BLOb'ы и осуществлять доступ к ним через методы класса Blob.

  • Если Вам не нужно хранить BLOb-данные в БД, Вы можете хранить в БД имена файлов и осуществлять доступ к этим файлам в Вашем приложении с помощью стандартных тэгов HTML. Например, если Вы хотите вывести изображение в каждом ряду таблицы БД, Вы можете создать в таблице столбец с названием imageFileName, содержащий имя нужного файла изображения. Затем можно использовать такое выражение HTML для показа изображения в каждом ряду:

    <IMG SRC=`mycursor.imageFileName`>

    Когда курсор проходит по таблице, имя файла в тэге IMG изменяется на ссылку на соответствующий файл.

    Для того чтобы Вы могли манипулировать реальными двоичными данными в Вашей БД, машина выполнения JavaScript распознаёт значения столбца, являющиеся BLOb-данными. То есть, когда программа создаёт объект Cursor, если один из столбцов таблицы БД содержит BLOb-данные, программа создаёт Blob -объект для соответствующего значения в объекте Cursor. Вы можете затем использовать методы Blob -объектов для отображения этих данных. Также, если нужно вставить BLOb-данные в БД, программа предоставляет Вам для использования глобальную функцию.

    В таблице показаны методы и функции для работы с BLOb-данными.

    Метод или ФункцияОписание



    blobImage

    Метод, используемый при отображении BLOb-данных, хранимых в БД. Возвращает тэг HTML IMG для специфицированного типа изображения (GIF, JPEG и т.д.).

    blobLink

    Метод, используемый при создании ссылки, которая указывает на BLOb-данные гиперссылкой. Возвращает гиперссылку HTML на BLOb.

    blob

    Глобальная функция, используема для вставки или обновления данных в ряду, содержащем BLOb-данные. Присваивает BLOb-данные столбцу в курсоре.


    Метод blobImage вызывает BLOb из БД, создаёт временный файл специфицированного формата и генерирует HTML-тэг IMG, который ссылается на временный файл. Машина выполнения удаляет временный файл после генерации страницы и отправки её клиенту.

    Метод blobLink вызывает BLOb-данные из БД, создаёт временный файл и генерирует гипертекстовую ссылку HTML на этот временный файл. Машина выполнения удаляет временный файл после того как пользователь щёлкнет на ссылке или через 60 секунд после того как запрос будет выполнен.

    Следующий пример иллюстрирует использование blobImage и blobLink для создания временных файлов. В данном случае таблица FISHTBL содержит 4 столбца: ID(ентификатор), name/имя и два изображения. Одно из них является уменьшенной копией/thumbnail изображения; другое - большим изображением. Код записывает HTML для отображения имени, уменьшенной копии и ссылки на большое изображение.

    cursor = connobj.cursor ("select * from fishtbl");if ( cursor && (connobj.majorErrorCode() == 0) ) {

    while (cursor.next()) {
          write (cursor.name);

          write (cursor.picture.blobImage("gif"));

          write (cursor.picture.blobLink("image\gif", "Link" + cursor.id));

          write ("<BR>");
       }

       cursor.close();
    }

    Если FISHTBL содержит ряды для 4 рыб, пример может дать на выходе такой HTML:

    Cod <IMG SRC="LIVEWIRE_TEMP9">

    <A HREF="LIVEWIRE_TEMP10">Link1 </A> <BR>
    Anthia <IMG SRC="LIVEWIRE_TEMP11">

       <A HREF="LIVEWIRE_TEMP12">Link2 </A> <BR>
    Scorpion <IMG SRC="LIVEWIRE_TEMP13">
       <A HREF="LIVEWIRE_TEMP14">Link3 </A> <BR>
    Surgeon <IMG SRC="LIVEWIRE_TEMP15">

    <A HREF="LIVEWIRE_TEMP16">Link4 </A> <BR>



    Если Вам нужно добавить BLOb-данные в БД, используйте глобальную функцию blob. Она вводит BLOb-данные в столбец в обновляемом курсоре. В противоположность blobImage и blobLink, функция blob является функцией верхнего уровня, а не методом.

    Следующие операторы вставляют BLOb-данные в столбцы ряда, а затем обновляют этот ряд таблицы FISHTBL в БД. В курсоре имеется единственный ряд.

    // Начало транзакции.

    database.beginTransaction();

    // Создание курсора.

    fishCursor = database.cursor ("select * from fishtbl where
       name='Harlequin Ghost Pipefish'", true);

    // Убедимся, что курсор создан.

    if ( fishCursor && (database.majorErrorCode() == 0) ) {

       // Позиционируем указатель на ряд.

       rowexists = fishCursor.next();

       if ( rowexists ) {       // Присваиваем/вставляем blob-данные.

    fishCursor.picture = blob ("c:\\data\\fish\\photo\\pipe.gif");      // Обновляем ряд.
           fishCursor.updateRow ("fishtbl");       // Закрываем курсор и подтверждаем изменения.

          fishCursor.close();

          database.commitTransaction();
       }

       else {

          // Иначе закрываем курсор и выполняем откат транзакции.

          fishCursor.close();

          database.rollbackTransaction();
       }
    }

    else {

       // Иначе вообще не получаем курсор; откатываем транзакцию.

    database.rollbackTransaction();
    }

    Помните, что backslash (\) это escape-символ в JavaScript. Исходя из этого, Вы обязаны использовать двойной обратный слэш в именах файлов NT, как было в данном примере.


    Содержание раздела