Spec-Zone.ru › RethinkDB java

Хранение двоичных объектов

Этот документ не полностью обновлен для Java. Документация API для Java полная, но во многих статьях ReQL по-прежнему есть примеры на других языках. Мы будем обновлять каждую статью после официального выпуска драйвера Java.

RethinkDB поддерживает родной тип двоичного объекта, позволяющий использовать ReQL для прямого хранения двоичных объектов в базе данных. Драйвер ReQL прозрачно преобразует между типом ReQL и байтами.

В этих примерах мы будем предполагать, что подключение к RethinkDB доступно в области видимости класса как conn.

Хранение загруженных файлов в базе данных

Для веб-приложений часто требуется принимать загрузки файлов от пользователей; с RethinkDB вы можете хранить эти файлы непосредственно в базе данных.

import java.io.file.*;

/**
 * Store a file in the database.
 *
 * @param filePath  the path to the file to save
 * @param saveName  the filename to store with the file in the database
 * @param userId    user ID value
 */
public void saveFile(String[] filePath, String[] saveName, long userId) {
    byte[] fileData = Files.readAllBytes(filePath);
    r.table("files").insert(
        r.hashMap("userId", userId)
         .with("filename", saveName)
         .with("file", r.binary(fileData))
    ).run(conn);
}

В saveFile, мы передаем путь к загруженному файлу (который может находиться в временном каталоге хранения, даже с временным именем в зависимости от используемой библиотеки загрузки), имя для сохранения файла и идентификатор пользователя, который загрузил файл. Команда ReQL binary используется для хранения содержимого файла в виде двоичного объекта в поле file.

def get_user_file_ids(user_id):
    """
    Retrieve the IDs of previously-saved files for a user as a list of
    dicts: [{'id': x, 'filename': y}, ...]
    """
    return r.table('files').filter({'user_id': user_id}).pluck(
        'id', 'filename').run(conn)

def get_file(file_id):
    """
    Retrieve a file by its ID. Returns a dict with 'filename' and 'file'
    keys.
    """
    return r.table('files').get(file_id).pluck('file', 'filename').run(conn)

Затем есть две функции для извлечения файлов: одна для извлечения каталога загруженных файлов пользователя (get_user_file_ids) и одна для извлечения самого файла (get_file). Нам не нужно использовать binary снова здесь; драйвер ReQL вернёт правильный тип данных для поля file в нашем объекте.

Хранение аватаров пользователей

Вот другой, более интересный пример: добавление аватаров Gravatar к учетным записям пользователей. Мы можем использовать http для их извлечения.

import hashlib

def add_gravatar(user_id):
    """
    Add a gravatar field with the binary avatar icon to user accounts if they
    have an avatar associated with their email address.
    """
    email = r.table('users').get(user_id)['email'].run(conn)
    hash = hashlib.md5(email).hexdigest()
    gravatar_url = 'http://www.gravatar.com/avatar/' + hash + '?d=retro'
    r.table('users').get(user_id).update({
        'gravatar': r.http(gravatar_url, result_format='binary')}).run(conn)

Где r.binary? Вам это не нужно в этом случае, потому что r.http вернёт двоичный объект с опцией result_format='binary'. (Если тип MIME на сервере отправки установлен правильно, вы можете даже убрать его, и r.http определит правильный тип.)

© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/docs/storing-binary/java/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API