Запись в файл на клиенте.

 
0
 
Oracle
ava
VIAcom | 01.07.2005, 17:47
Понятно, почему нельзя писать куды угодно на сервак, а только в отведенное место, но вот почему я не могу писать на свою собственную машину, на клиента тобишь :qstn

Например я хочу скинуть текстовый файлик - отчет к себе на винчестер, а не на винт сервера, с которого инфу кстати еще не факт, что посмотреть сможешь ...

И еще вопрос можно ли читать файлы с клиента? Я работал только с UTL_FILE ... может есть еще пакеты?

Заранее спасибо.
Comments (11)
ava
LSD | 01.07.2005, 19:50 #
Цитата (VIAcom @ 1.7.2005, 17:47)
Например я хочу скинуть текстовый файлик - отчет к себе на винчестер, а не на винт сервера, с которого инфу кстати еще не факт, что посмотреть сможешь ...

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


Цитата (VIAcom @ 1.7.2005, 17:47)
И еще вопрос можно ли читать файлы с клиента? Я работал только с UTL_FILE ... может есть еще пакеты?

Есть еще позможность использовать хранимые процедуры на Java, там возможностей будет побольше.
ava
VIAcom | 04.07.2005, 08:31 #
Клиентская программа - Парус, оа уже есть и мне ее переписывать низя ... поэтому мне только через сервак на клиент писать, но может Парус и может какнить писать, просто я об этом не знаю пока :(

Java - это хорошо, но беда в том, что я ее только понимаю а писать тольком не могу, только примитив, ибо не знаю ни функций ни классов. Примерчик какойнить не хитрый бы ....
ava
igon | 04.07.2005, 14:39 #
Цитата
поэтому мне только через сервак на клиент писать

Напиши собственного клиента, если нельзя типа plug-in к Парусу прикрутить.
Запись на клиента по инициативе сервера (push-технология?) будет, ИМХО, существенно сложнее, если клиентов много, каждому нужно свое и по своему расписанию.
ava
VIAcom | 04.07.2005, 15:41 #
igon
Цитата
Напиши собственного клиента

Предлагаешь Парус переписать? smile
ava
LSD | 04.07.2005, 20:13 #
Цитата (VIAcom @ 4.7.2005, 16:41)
Предлагаешь Парус переписать?

Вовсе нет. На серваке пишется процедура которая предоставляет данные в нужном виде, на клиенте программа которая записывает эти данные в файл.
Пакет UTL_FILE позволяет работать с локальной файловой системой, локальные диски + диски подключенные через NFS. У Java возможности побольше но не намного. Так что единственый нормальный выход это клиент, или модифицировать парусовский или писать отдельный для данного случая.
ava
VIAcom | 05.07.2005, 08:21 #
LSD
Нет не пойдет, даже если написать отдельнуюб прогу на Дельфи, ее вызывать никто не будет, т.к. заказчику совершенно невозможно открывать еще что то акромя Паруса, и уж тем более в нем работать. Эта схмема сложной получается чересчур.
Но там есть обходной маневр в самом Парусе, правда уж больно "обходной" и не хочется его юзать ...

Спасибо за ответ.
ava
igon | 05.07.2005, 18:05 #
Цитата
я (==заказчик?) хочу скинуть текстовый файлик - отчет к себе на винчестер

но для меня
Цитата
совершенно невозможно открывать еще что то акромя Паруса, и уж тем более в нем работать.

Хм, типа "по щучьему велению"? smile
Вариант:
В .bat файл прописываешь
1. Запуск собственно Паруса
2. Запуск Дельфи программы (as service?), которая по timeout (расписанию) обращается к серверу за отчетом и по получении "пищит" (как в аське): "У Вас новый отчет!!!"
Иконку Паруса перенаправляешь на .bat файл
Вариант:
Дельфи программа стартует при запуске компьютера.
"Работать" с такой Дельфи программой вовсе не обязательно - все настройки по умолчанию, на рабочем столе только файл (иконка) с отчетом. Не так все это и сложно. ИМХО smile
ava
VIAcom | 06.07.2005, 08:26 #
Цитата


Хм, типа "по щучьему велению"? smile


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

Все другое не окупиться ИМХО.
ava
LSD | 07.07.2005, 00:07 #
Чтобы из хранимки записать в файл, локальная ФС клиента должна быть подключенна к серверу, или через NFS для *nix систем, или через сетевые шары для Windows систем. Вы готовы пойти на такое? И реализуемо ли это, технически?
Если да, то я могу написать подобную процедерку.
ava
VIAcom | 08.07.2005, 15:27 #
Что там как возможно у аказчика я не знаю, я не их сис. админ. Но если такое возможно и это не слишком хитро, то почему нет, сразу скажу, что затруднять себя специальным написанием процедуры не имеет, думаю, смысла. Хотя я очень приятно удивлен и польшен оказанному вниманию.

Что такого дикого в записи на клиент с сервера, может я чегото недопонимаю, но серевер разве не должен видет расшаренные папки, или это дурная практика чреватая снижением производительности/безопасности. Я не специалист по сетям и в этом чесно говоря плохо разбираюсь.
ava
LSD | 11.07.2005, 12:07 #
Итак запись на клиентскую машину.
1. Создаем Java class
create or replace and compile java source named write_to_client as
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.*;

public class NetWrite
{
private static final char FILE_SEPARATOR = '\\';
private static final byte[] buffer = new byte[1024];

public static void writeToFile(String machineName, String directory, String file, Blob data) throws Exception
{
StringBuffer fileName = new StringBuffer(50);
fileName.append(FILE_SEPARATOR).append(FILE_SEPARATOR);
fileName.append(machineName).append(FILE_SEPARATOR);
fileName.append(directory).append(FILE_SEPARATOR);
fileName.append(file).append(FILE_SEPARATOR);
FileOutputStream out = new FileOutputStream(fileName.toString());
InputStream in = data.getBinaryStream();
int read = 0;
while( (read = in.read(buffer)) > 0)
out.write(buffer, 0, read);
in.close();
out.close();
}
}
/

2. Создаем процедуру на PL/SQL
create or replace procedure WRITE_CLIENT(mashine varchar2, directory varchar2, file varchar2, data blob) as
language java name 'NetWrite.writeToFile(java.lang.String, java.lang.String, java.lang.String, java.sql.Blob)';

3. Выдаем разрешения на запись в файл
begin
-- Call the procedure
sys.dbms_java.grant_permission('PUBLIC', 'java.io.FilePermission', '\\workstation1\temp\*', 'read,write');
end;
/

4. Проверяем
declare 
bin_data blob;
begin
select photo_data into bin_data from photos where id = 'D490AA09AEF3424A9AEEFAAC638B283E';
write_client('workstation1', 'temp', 'data.bin', bin_data);
end;
/
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
ava  LSD   igon   VIAcom
advanced
Submit