Допустим, у меня есть такая модель:

@Entity
public class Picture extends Model {
  public Blob image;
  ...
}

Когда я смотрю тип в базе данных mysql, это просто путь к папке вложений (VARCHAR). Есть ли способ изменить это, чтобы сохранить двоичные данные в mysql (BLOB) с помощью воспроизведения?

Я бы хотел этого добиться:

CREATE TABLE picture (             
             ......
              image blob,                         
            ...        
 );

Использование JDBC для установки изображения:

"psmnt.setBinaryStream (3, (InputStream) fis, (int) (image.length ()));"

Я не знаю, имеет ли это вообще смысл, но если нет, пожалуйста, объясните мне, почему! Зачем иметь папку вложений в игровом проекте?

2
Alan Souza 18 Фев 2011 в 22:47
Вот хорошая статья о вашей проблеме lunatech-research.com/playframework-file-upload -blob
 – 
tapi
14 Мар 2012 в 17:37

2 ответа

Лучший ответ

В Play тип Blob хранит только хеш-ссылку на файл и его mime-тип. Причина в том, что базы данных не любят слишком много больших BLOB-объектов (по внутренней причине), и рекомендуется хранить файлы отдельно. Это также избавит вас от головной боли, связанной с кодированием и резервным копированием, поверьте мне (и, что более важно, доверяйте разработчикам Play!)

В качестве альтернативы вы можете сохранить свое изображение как:

@Entity
public class YourClass extends Model {

  @Basic(fetch = FetchType.LAZY)
  @Lob
  public byte[] image;

  public String mime_type;
  public String file_name;    
}

Вам нужно будет сохранить тип mime отдельно (тип Blob хранит его в базе данных в поле), чтобы иметь возможность работать с файлом, и вы можете захотеть сохранить исходное имя файла, данное вам. Чтобы определить тип MIME, я бы рекомендовал использовать mime-util.

В качестве последнего примечания имейте в виду, что если вы используете Play Blob, когда вы удаляете поле (через CRUD или API), файл не удаляется из файловой системы. Вам нужно будет создать задание, которое время от времени проверяет наличие неиспользуемых файлов, чтобы освободить место.

Это происходит (по словам Гиллома) из-за невозможности иметь безопасную двухфазную транзакцию между базой данных и файловой системой. это актуально, так как в зависимости от вашего приложения вы можете обнаружить, что ваша файловая система заполнена неиспользуемыми изображениями :)

2
Pere Villega 21 Фев 2011 в 14:40

Ну, поскольку хранение медиафайлов (изображений / видео / аудио / и т. Д.) Очень редко (в базе данных), я предполагаю, что команда разместила эту реализацию Blob, чтобы сделать ее более «эффективной», вместо того, чтобы извлекать двоичные файлы из базы данных ( база данных будет меньше забиваться). Честно говоря, я никогда не использовал функцию Blob, я знаю, что вы можете просто реализовать свой собственный Blob и прочитал несколько сообщений об этом.

http://groups.google.com/group/play-framework/browse_thread/thread/7e7e0b00a48eeed9

Обратите внимание, как сказал Гийом, Blob - это новая версия класса File Attachment, который использовался раньше, чем 1.1. Если вы хотите сохранить изображение и используете спящий режим

@Entity
public class Picture extends Model {

  @Lob(type = LobType.BLOB)
  public byte[] image;
  ...
}
3
allenskd 19 Фев 2011 в 23:00