powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Работа c Oracle директорией напрямую. Возможно ли?
16 сообщений из 16, страница 1 из 1
Работа c Oracle директорией напрямую. Возможно ли?
    #38136107
metis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.



Application Express 4.1.1.00.23.

Клиент должен загрузить файл (картинка) на сервер. Сейчас используется механизм загрузки файла в поле BLOB определенной таблицы. Далее BLOB переносится в директорию на сервере

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
CREATE OR REPLACE PROCEDURE load_blob_to_bfile (p_file_name IN VARCHAR2, p_directory IN VARCHAR2)
   IS

/* This procedure will transfer a blob to bfile. */

      v_blob        BLOB;
      v_start       NUMBER             := 1;
      v_bytelen     NUMBER             := 2000;
      v_len         NUMBER;
      v_raw         RAW (2000);
      v_x           NUMBER;
      v_output      UTL_FILE.file_type;
      v_file_name   VARCHAR2 (200);
   BEGIN

-- get length of blob

      SELECT DBMS_LOB.getlength (kartfile), filename
        INTO v_len, v_file_name
        FROM kart_files 
       WHERE filename = Trim(p_file_name);

v_file_name:=CONVERT(v_file_name, 'CL8MSWIN1251', 'UTF8');

-- define output directory

      v_output := UTL_FILE.fopen (p_directory, v_file_name, 'wb', 32760);

-- save blob length


      v_x := v_len;


-- select blob into variable


      SELECT kartfile
        INTO v_blob
        FROM kart_files 
       WHERE filename = Trim(p_file_name);

      v_start := 1;

--      l_raw  := utl_i18n.string_to_raw(l_xml, 'UTF8');

      WHILE v_start < v_len AND v_bytelen > 0
      LOOP
         DBMS_LOB.READ (v_blob, v_bytelen, v_start, v_raw);
            v_raw:=CONVERT(v_raw, 'CL8MSWIN1251', 'UTF8');
         UTL_FILE.put_raw (v_output, v_raw);
         UTL_FILE.fflush (v_output);


         /* Text only could be: UTL_RAW.cast_to_varchar2 (v_raw);*/

         -- set the start position for the next cut


         v_start := v_start + v_bytelen;


-- set the end position if less than 32000 bytes


         v_x := v_x - v_bytelen;

         IF v_x < 2000
         THEN
            v_bytelen := v_x;
         END IF;
      END LOOP;

      UTL_FILE.fclose (v_output);
   END load_blob_to_bfile;
  



и строка таблицы содержащая BLOB удаляется, а имя сохраненного файла сохраняется в другой таблице. Таким образом, файлы в БД храниться не должны. На странице клиента вся это процедура (от загрузки в BLOB до выгрузки в директорию) зашита в процесс.

НО: в процессе выполнения PROCEDURE load_blob_to_bfile (при условии больших файлов 7 -10 МБ) загрузка происходит очень долго.

Что посоветуете, как правильнее организовать эту задачу?
...
Рейтинг: 0 / 0
Работа c Oracle директорией напрямую. Возможно ли?
    #38136238
haXbat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
metis,

Можно ли отложить перенос файлов из базы в файловую систему? Т.е. пользователь ждет только загрузки файла в табличку, а потом джоб одним махом все записи переносит в файловую систему.
...
Рейтинг: 0 / 0
Работа c Oracle директорией напрямую. Возможно ли?
    #38136283
metis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
haXbatmetis,

Можно ли отложить перенос файлов из базы в файловую систему? Т.е. пользователь ждет только загрузки файла в табличку, а потом джоб одним махом все записи переносит в файловую систему.

Нет, потому как за операцией загрузки файла в таблицу следует авторизация записи и другому пользователю нужно просмотреть вложенный файл
...
Рейтинг: 0 / 0
Работа c Oracle директорией напрямую. Возможно ли?
    #38136391
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
metisЧто посоветуете, как правильнее организовать эту задачу?
metisНет, потому как за операцией загрузки файла в таблицу следует авторизация записи и другому пользователю нужно просмотреть вложенный файл

Можно описать всю задачу, а не только Ваше решение? А то сейчас насоветуем.

Можете джобом переписывать файл из BLOB в BFILE; сущности, атрибутом которой является файл, добавьте атрибут "Статус", который джоб изменит по завершении. Соответственно, авторизация (?) пусть тоже входит в джоб, а другому пользователю записи выдаются с учётом состояния.

Если не XE и хочется оставить синхронность, можете попробовать выгружать хранимой процедурой Java. Есть шанс, что окажется быстрее.
...
Рейтинг: 0 / 0
Работа c Oracle директорией напрямую. Возможно ли?
    #38136453
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
metisСейчас используется механизм загрузки файла в поле BLOB определенной таблицы.
Опишите как реализован механизм загрузки в kart_files сейчас

metisНО: в процессе выполнения PROCEDURE load_blob_to_bfile (при условии больших файлов 7 -10 МБ) загрузка происходит очень долго.
Можно подробнее, примерно, сколько у вас времени уходит на сеть, сколько на загрузку в таблицу kart_files и сколько на load_blob_to_bfile ?

Укажите так же сценарий установки
...
Рейтинг: 0 / 0
Работа c Oracle директорией напрямую. Возможно ли?
    #38136516
metis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDevОпишите как реализован механизм загрузки в kart_files сейчас

FileBrowse смотрит на wwv_flow_files , а дальше процесс

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
DECLARE
 v_len number;
BEGIN
   IF (:P28_FILE IS NOT NULL)
   THEN 
    SELECT (DBMS_LOB.getlength (blob_content)/1024) L 
       INTO v_len           
       FROM wwv_flow_files
         WHERE NAME = :P28_FILE;
        
    IF (v_len < 1500) THEN
      INSERT INTO kart_files
                  (ID, FILENAME,mimetype,kartfile)
      SELECT ID, :P28_FILE,mime_type,blob_content            
       FROM wwv_flow_files
         WHERE NAME = :P28_FILE;
   
  DELETE WWV_FLOW_FILE_OBJECTS$
    WHERE NAME = :P28_FILE;
 

   load_blob_to_bfile(p_file_name => :P28_FILE,
                     p_directory => 'KART_DIR');

 END IF;

 DELETE WWV_FLOW_FILE_OBJECTS$
          WHERE NAME = :P28_FILE;  


 IF (v_len > 1500) THEN
                
--       raise_application_error(-20000,

apex_application.g_print_success_message := 
('Слишком большой файл сканированного документа,допустимый размер не более 1,5 МБ ');

  END IF;

 END IF;
 END;




SvDev Можно подробнее, примерно, сколько у вас времени уходит на сеть, сколько на загрузку в таблицу kart_files и сколько на load_blob_to_bfile ?

Укажите так же сценарий установки

На загрузку в kart_files - секунды , а вот на "побайтовый разбор" блоба в директории долговасьтенько (((
...
Рейтинг: 0 / 0
Работа c Oracle директорией напрямую. Возможно ли?
    #38136527
metis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
suPPLer
Можно описать всю задачу, а не только Ваше решение? А то сейчас насоветуем.

Первый Клиент должен загрузить файл (картинка) на сервер. Второй клиент просматривает загруженное изображение и если ему все нравится ставит признак "удовлетворенности" изображения. Файлы в БД храниться не должны.

suPPLer Можете джобом переписывать файл из BLOB в BFILE; сущности, атрибутом которой является файл, добавьте атрибут "Статус", который джоб изменит по завершении. Соответственно, авторизация (?) пусть тоже входит в джоб, а другому пользователю записи выдаются с учётом состояния.

Если не XE и хочется оставить синхронность, можете попробовать выгружать хранимой процедурой Java. Есть шанс, что окажется быстрее.

Джоб не подойдет. Использую именно XE , поэтому такая галиматья с файлами. Java - тоже нет.
...
Рейтинг: 0 / 0
Работа c Oracle директорией напрямую. Возможно ли?
    #38136551
Migelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
metisНО: в процессе выполнения PROCEDURE load_blob_to_bfile (при условии больших файлов 7 -10 МБ) загрузка происходит очень долго.

1. Долго - это сколько? Попробовал: у меня запись блоба размером 81МБ в файл происходит за 0.9с Скорее всего время тратится на передачу файла.
2. Я бы буфер увеличил до 30К
3. А зачем картинку конвертировать из UTF-8 в 1251? Она не портится от этого?
...
Рейтинг: 0 / 0
Работа c Oracle директорией напрямую. Возможно ли?
    #38136555
metis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И самое главное, после того как выложили файл в директорию , нужно сохранить ссылку на него в таблице. Ссылки должны храниться в базе всегда. Для дальнейшего просмотра думаю использовать BFILE (?) для возможности подгрузки файлов с директории
...
Рейтинг: 0 / 0
Работа c Oracle директорией напрямую. Возможно ли?
    #38136565
metis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Migelle 1. Долго - это сколько? Попробовал: у меня запись блоба размером 81МБ в файл происходит за 0.9с Скорее всего время тратится на передачу файла.
2. Я бы буфер увеличил до 30К
3. А зачем картинку конвертировать из UTF-8 в 1251? Она не портится от этого?


81МБ в файл происходит за 0.9с - это очень хорошо , у меня 7МБ за 10-15 сек. Про буфер не понял. Конвертится не картинка на название файла, т.к при сохранении русских букв в названии образуются кракозябры
...
Рейтинг: 0 / 0
Работа c Oracle директорией напрямую. Возможно ли?
    #38136614
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
metisДжоб не подойдет.
Потому что?..
...
Рейтинг: 0 / 0
Работа c Oracle директорией напрямую. Возможно ли?
    #38136679
Migelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
metisПро буфер не понял.
Код: plaintext
1.
2.
v_bytelen     NUMBER             := 2000;
v_len         NUMBER;
v_raw         RAW (2000);

metisКонвертится не картинка на название файла, т.к при сохранении русских букв в названии образуются кракозябры
А это тогда что?

Код: plaintext
1.
2.
DBMS_LOB.READ (v_blob, v_bytelen, v_start, v_raw);
v_raw:=CONVERT(v_raw, 'CL8MSWIN1251', 'UTF8');
UTL_FILE.put_raw (v_output, v_raw);
...
Рейтинг: 0 / 0
Работа c Oracle директорией напрямую. Возможно ли?
    #38136744
metis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MigelleА это тогда что?


а это подлежит исключению из кода
...
Рейтинг: 0 / 0
Работа c Oracle директорией напрямую. Возможно ли?
    #38136748
metis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
suPPLermetisДжоб не подойдет.
Потому что?..

metishaXbatmetis,

Можно ли отложить перенос файлов из базы в файловую систему? Т.е. пользователь ждет только загрузки файла в табличку, а потом джоб одним махом все записи переносит в файловую систему.

Нет, потому как за операцией загрузки файла в таблицу следует авторизация записи и другому пользователю нужно просмотреть вложенный файл
...
Рейтинг: 0 / 0
Работа c Oracle директорией напрямую. Возможно ли?
    #38136751
metis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MigellemetisПро буфер не понял.
Код: plaintext
1.
2.
v_bytelen     NUMBER             := 2000;
v_len         NUMBER;
v_raw         RAW (2000);

metisКонвертится не картинка на название файла, т.к при сохранении русских букв в названии образуются кракозябры
А это тогда что?

Код: plaintext
1.
2.
DBMS_LOB.READ (v_blob, v_bytelen, v_start, v_raw);
v_raw:=CONVERT(v_raw, 'CL8MSWIN1251', 'UTF8');
UTL_FILE.put_raw (v_output, v_raw);



Понял.Спасибо,попробую
...
Рейтинг: 0 / 0
Работа c Oracle директорией напрямую. Возможно ли?
    #38136865
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
metisНет, потому как за операцией загрузки файла в таблицу следует авторизация записи и другому пользователю нужно просмотреть вложенный файл

Это не помеха сделать всё в джобе, который выполняется сразу после вставки в WWV_FLOW_FILES. Пользователь Вася успешно загрузил файл на сервер, в процессе страницы запустился джоб . В джобе процедура перекинула BLOB из WWV_FLOW_FILES в файловую систему, создала BFILE в таблице и обновила статус сущности, с которой связан файл, на "Загружен и доступен".
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Работа c Oracle директорией напрямую. Возможно ли?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]