Сериализовать документ в базе данных и работать с ним

Одной из задач, которые могут потребоваться при работе с документами, является хранение и извлечение объектов Document в базу данных и из нее. Например, это было бы необходимо, если бы вы внедряли систему управления контентом любого типа. Все предыдущие версии документов должны храниться в системе баз данных. Возможность хранить документы в базе данных также чрезвычайно полезна, когда ваше приложение предоставляет веб-сервис.

Aspose.Words предоставляет возможность преобразовать документ в массив байт для последующей работы с этим документом в базе данных.

Преобразование документа в массив байтов

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

Чтобы сериализовать объект Document в Aspose.Words:

  1. Сохраните его в MemoryStream, используя перегрузку метода Save класса Document.
  2. Вызовите метод ToArray, который возвращает массив байт, представляющий документ в байтовой форме.

Затем описанные выше шаги можно отменить, чтобы загрузить байты обратно в объект Document.

В приведенном ниже примере показано, как сериализовать объект Document для получения массива байт, а затем как отменить сериализацию массива байт, чтобы снова получить объект Document:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Load the document.
Document doc = new Document(dataDir + "Test File (doc).doc");
// Create a new memory stream.
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
// Save the document to stream.
doc.save(outStream, SaveFormat.DOCX);
// Convert the document to byte form.
byte[] docBytes = outStream.toByteArray();
// The bytes are now ready to be stored/transmitted.
// Now reverse the steps to load the bytes back into a document object.
ByteArrayInputStream inStream = new ByteArrayInputStream(docBytes);
// Load the stream into a new document object.
Document loadDoc = new Document(inStream);

Хранение, чтение и удаление документа в базе данных

В этом разделе показано, как сохранить документ в базе данных, а затем загрузить его обратно в объект Document для работы с ним. Для простоты имя файла является ключом, используемым для хранения и извлечения документов из базы данных. База данных содержит два столбца. Первый столбец “FileName” хранится в виде строки и используется для идентификации документов. Второй столбец “FileContent” хранится в виде объекта BLOB, который хранит объект документа в байтовой форме.

В следующем примере кода показано, как настроить подключение к базе данных и выполнять команды:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
String url1 = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "123";
// Open a database connection.
Connection mConnection = DriverManager.getConnection(url1, user, password);

В следующем примере кода показано, как сохранить документ в базе данных, затем снова прочитать тот же документ и, наконец, удалить запись, содержащую документ, из базы данных:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Store the document to the database.
StoreToDatabase(doc, mConnection);
// Read the document from the database and store the file to disk.
Document dbDoc = ReadFromDatabase(dataDir + fileName, mConnection);
// Save the retrieved document to disk.
dbDoc.save(dataDir + fileName);
// Delete the document from the database.
DeleteFromDatabase(dataDir + fileName, mConnection);
// Close the connection to the database.
mConnection.close();

Сохранение документа в базе данных

Чтобы сохранить документ в базе данных, преобразуйте его в массив байт, как описано в начале этой статьи. Затем сохраните этот массив байт в поле базы данных.

В следующем примере кода показано, как сохранить документ в указанной базе данных:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
public static void StoreToDatabase(Document doc, Connection mConnection) throws Exception {
// Create an output stream which uses byte array to save data
ByteArrayOutputStream aout = new ByteArrayOutputStream();
// Save the document to byte array
doc.save(aout, SaveFormat.DOCX);
// Get the byte array from output steam
// the byte array now contains the document
byte[] buffer = aout.toByteArray();
// Get the filename from the document.
String fileName = doc.getOriginalFileName();
String filePath = fileName.replace("\\", "\\\\");
// Create the SQL command.
String commandString = "INSERT INTO Documents (FileName, FileContent) VALUES('" + filePath + "', '" + buffer
+ "')";
Statement statement = mConnection.createStatement();
statement.executeUpdate(commandString);
}

Укажите commandString, которое является выражением SQL, выполняющим всю работу:

  • Для сохранения документа в базе данных используется команда “INSERT INTO” и указывается таблица со значениями двух полей записи – FileName и FileContent. Чтобы избежать дополнительных параметров, имя файла берется из самого объекта Document. Значению поля FileContent присваиваются байты из потока памяти, который содержит двоичное представление сохраненного документа.
  • Оставшаяся строка кода выполняет команду, которая сохраняет документ Aspose.Words в базе данных.

Извлечение документа из базы данных

Чтобы извлечь документ из базы данных, выберите запись, содержащую данные документа в виде массива байт. Затем загрузите массив байт из записи в MemoryStream и создайте объект Document, который загрузит документ из MemoryStream.

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
private static Document ReadFromDatabase(String fileName, Connection mConnection) throws Exception {
// Create the SQL command.
String commandString = "SELECT * FROM Documents WHERE FileName=?";
PreparedStatement statement = mConnection.prepareStatement(commandString);
statement.setString(1, fileName);
Document doc = null;
ResultSet result = statement.executeQuery();
if (result.next()) {
Blob blob = result.getBlob("FileContent");
InputStream inputStream = blob.getBinaryStream();
doc = new Document(inputStream);
inputStream.close();
System.out.println("File saved");
}
result.close();
return doc;
}

Удаление документа из базы данных

Чтобы удалить документ из базы данных, используйте соответствующую команду SQL без каких-либо манипуляций с объектом Document.

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
private static void DeleteFromDatabase(String fileName, Connection mConnection) throws Exception {
// Create the SQL command.
String commandString = "DELETE FROM Documents WHERE FileName='" + fileName + "'";
Statement statement = mConnection.createStatement();
// Delete the record.
statement.execute(commandString);
}