Хранить и получать текстовые документы с MySQL

0

Мне нужно хранить и извлекать документы 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)?

  • 1
    Возможно, вы уже слышали этот вопрос раньше, но ... обязательно ли хранить целые документы в базе данных, а не в обычных файлах? Использование MySQL для этого может быть медленнее, и вы можете столкнуться с проблемами с очень большими документами (например, если превышен max_allowed_packet). dev.mysql.com/doc/refman/5.1/en/program-variables.html
Теги:
servlets
file-upload

2 ответа

0
Лучший ответ

Частичный ответ на сохранение документов 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;

В приведенном выше коде предполагается, что при возникновении ошибки возникает исключение.

1

Я согласен с Archimedix... Вместо того, чтобы помещать их в MySQL как BLOB, вы можете сохранить файл на диске и сохранить его путь в MYSQL как поле TEXT. Таким образом, ваше время поиска будет низким. Если вы сознательны в пространстве, вы можете закрепить документ и сохранить его на диске и по запросу распаковать и отправить его.

UPDATE

Из вашего кода видно, что у вас уже есть дескриптор файла, и вы можете сохранить его на сервере. Теперь, чтобы сэкономить место, вы можете закрепить его, используя утилиту java zip по умолчанию. Вы можете столкнуться с проблемой, когда два человека загружают два разных файла с тем же именем. Чтобы избежать подобных сценариев, вы можете переименовать свой архивный документ с помощью uuid (используйте класс java 6 uuid), или вы можете создать SHA1 для этого файла и использовать его для имени.

Теперь вы можете использовать абсолютный путь архивированного (и переименованного файла) для хранения в MySQL.

Вместо схемы таблицы

Ресурсы

  • UserID [varchar (15)]
  • Документ [mediumblob]

Вы можете использовать

Ресурсы

  • UserID [varchar (15)]
  • Документ [varchar (512)]

Итак, для такого запроса: Выберите Документ из таблицы Документы WHERE UserID = 'abcd';

теперь вы получите абсолютный путь для заархивированного файла. Раскройте этот файл и отправьте его.

  • 0
    Спасибо, братан ... Но я понятия не имею, как организовать физическое хранение файлов и наличие пути в таблицах MySQL? У вас есть пример кода, чтобы я мог лучше понять ...
  • 0
    Добро пожаловать.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню