Хранить и получать текстовые документы с MySQL - PullRequest
0 голосов
/ 27 сентября 2010

Мне нужно хранить и извлекать документы MS Word в MySQL 5.1 с сервлетами. У меня есть код для загрузки файла, но я не знаю, могу ли я подать в таблицу. Я использовал 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)?

Ответы [ 2 ]

1 голос
/ 27 сентября 2010

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

ОБНОВЛЕНИЕ

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

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

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

ресурсы

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

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

ресурсов

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

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

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

0 голосов
/ 27 сентября 2010

Частичный ответ при хранении документов Word в файлах:
Вам не нужен дополнительный столбец для сохранения имени файла, поскольку идентификатор записи документа может служить именем файла.

При сохранении нового документа выполните транзакцию базы данных, чтобы можно было отменить процесс, если что-то пойдет не так.

В псевдокоде это будет выглядеть так:

begin transaction;

try {
    save new record for document;
    save Word document in predefined directory, using record's ID as the filename;
} catch (Exception e) {
    rollback transaction;
    throw e; // Rethrow exception
}

commit transaction;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...