Мне нужно хранить и извлекать документы MS Word в MySQL 5.1 с помощью Servlets. У меня есть код для загрузки файла, но я не знаю, могу ли я подать в таблицу. Я использовал BLOB для поля, которое я должен вставить .doc файлы.
Здесь мой фрагмент кода для загрузки файлов:
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
// get access to file that is uploaded from client
Part p1 = request.getPart("file");
String type=p1.getContentType();
String name=p1.getName();
long size = p1.getSize();
InputStream is = p1.getInputStream();
//FileInputStream fis = is.
// read filename which is sent as a part
Part p2 = request.getPart("name");
Scanner s = new Scanner(p2.getInputStream());
String filename = s.nextLine(); // read filename from stream
// get filename to use on the server
String outputfile = this.getServletContext().getRealPath(filename); // get path on the server
FileOutputStream os = new FileOutputStream (outputfile);
// write bytes taken from uploaded file to target file
int ch = is.read();
while (ch != -1) {
os.write(ch);
ch = is.read();
}
os.close();
out.println("<h3>File : '" + name + "' Type : '" + type + "' "
+ "of Size : " + ((double) size/1024) + "KB uploaded successfully!</h3>");
}
catch(Exception ex) {
out.println("Exception -->" + ex.getMessage());
}
finally {
out.close();
}
}
Здесь я использовал функцию Servlets 3.0 для загрузки файла... Моя схема таблицы:
resources
- UserID [varchar(15)]
- Document [mediumblob]
Может ли кто-нибудь помочь мне, как я могу сохранить документ в таблице, и хотя BLOB - это тип, представляющий двоичные данные, как я могу получить документ Word (*.doc)?
Частичный ответ на сохранение документов Word в файлах:
Вам не нужен дополнительный столбец для сохранения имени файла, поскольку идентификатор записи документа может служить именем файла.
При сохранении нового документа выполните транзакцию базы данных, чтобы вы могли отменить процесс, когда что-то пошло не так.
В псевдокоде это будет выглядеть так:
begin transaction;
try {
save new record for document;
save Word document in predefined directory, using record ID as the filename;
} catch (Exception e) {
rollback transaction;
throw e; // Rethrow exception
}
commit transaction;
В приведенном выше коде предполагается, что при возникновении ошибки возникает исключение.
Я согласен с Archimedix... Вместо того, чтобы помещать их в MySQL как BLOB, вы можете сохранить файл на диске и сохранить его путь в MYSQL как поле TEXT. Таким образом, ваше время поиска будет низким. Если вы сознательны в пространстве, вы можете закрепить документ и сохранить его на диске и по запросу распаковать и отправить его.
UPDATE
Из вашего кода видно, что у вас уже есть дескриптор файла, и вы можете сохранить его на сервере. Теперь, чтобы сэкономить место, вы можете закрепить его, используя утилиту java zip по умолчанию. Вы можете столкнуться с проблемой, когда два человека загружают два разных файла с тем же именем. Чтобы избежать подобных сценариев, вы можете переименовать свой архивный документ с помощью uuid (используйте класс java 6 uuid), или вы можете создать SHA1 для этого файла и использовать его для имени.
Теперь вы можете использовать абсолютный путь архивированного (и переименованного файла) для хранения в MySQL.
Вместо схемы таблицы
Ресурсы
Вы можете использовать
Ресурсы
Итак, для такого запроса: Выберите Документ из таблицы Документы WHERE UserID = 'abcd';
теперь вы получите абсолютный путь для заархивированного файла. Раскройте этот файл и отправьте его.