Имя: Пароль:
1C
1С v8
Загрузка файла на сервер, прогресс
0 Nikoss
 
25.01.13
10:18
Есть тонкий клиент, по кнопке передаю файл на сервер. Можно ли как-то проследить сколько уже загружено? Хочу сделать полоску загрузки на стороне клиента. Как сделать саму полоску варианты есть, а вот как понять сколько, допустим Кбайт, загружено уже, не понятно.

Вообще делаю так: помещаю на клиенте в ХранилищеЗначений этот самый файл, потом передаю на серную функцию параметром, а на сервере записываю на локальный диск уже методом Записать для двоичных данных из ХранилищаЗначений
1 Cube
 
25.01.13
10:19
(0) Если делать по методике 1С (не дергать сервер 100 раз в секунду), то такое взлетит только в клиент-серверном варианте работы.
2 Cube
 
25.01.13
10:21
+(1) Ой, я не правильно прочел (0). Ты ещё до этого этапа не дошел))
3 Nikoss
 
25.01.13
10:24
(1), (2), проще так: мне нужно в определенный момент времени узнать какой объем данных (процент, или байт, или чего там еще, без разницы) передан уже на сервер.

по прогрессбару пока не заморачиваться.
4 Cube
 
25.01.13
10:28
(3) А что значит "передан на сервер"? Код покажи, что ли...
5 Reset
 
25.01.13
10:31
Никак, по моему.
Через заднее место - разбить файл на 10 частей, передавать по одной - будет процент с шагом 10.
6 Nikoss
 
25.01.13
10:41
&НаКлиенте
ХранилищеКартинки = МодульНаКлиенте.ПоместитьФайлВХранилищеЗначений(ДиалогОткрытияФайла.ПолноеИмяФайла, УникальныйИдентификатор);
ПопыткаСкопироватьФайл(Расширение, ХранилищеКартинки, УникальныйИдентификатор)



&НаСервереБезКонтекста
Функция ПопыткаСкопироватьФайл(Расширение, ХранилищеКартинки, УникальныйИдентификатор)

   ДвоичныеДанныеКартинки = ПолучитьИзВременногоХранилища(ХранилищеКартинки);
   Откуда = КаталогВременныхФайлов() + УникальныйИдентификатор + Файл;
   ДвоичныеДанныеКартинки.Записать(Откуда);

КонецФункции

Примерно так, думаю смысл понятен.

Только не знаю когда передается на сервер, в момент запуска функции, или в момент ПолучитьИзВременногоХранилища(ХранилищеКартинки)...
7 Cube
 
25.01.13
10:47
(6) В этом случае никак.
8 Nikoss
 
25.01.13
10:48
(7) а в каком случае "как"? :)
9 Nikoss
 
25.01.13
10:48
(5), если других вариантов не будет, можно и этот рассмотреть.  Коряво конечно, и вызовов сервера прибавится...
Только как разбивать?
10 Cube
 
25.01.13
10:53
(8) Случаев множество) Но для твоей задачи - никак.
11 Nikoss
 
25.01.13
10:56
(10) жаль. Может логику сей операции поменять как-то, чтобы появились варианты? Или ничего не поможет?
12 H A D G E H O G s
 
25.01.13
10:56
Можно
13 H A D G E H O G s
 
25.01.13
10:56
Base64Строка()
Base64Значение()
14 Cube
 
25.01.13
10:57
(11) Ну, если хранить данные не в БД, а в папке на сервере, то, мне кажется, будут варианты...
15 Ayvengo
 
25.01.13
11:00
(0) почитай тут http://infostart.ru/public/157706/
16 Ayvengo
 
25.01.13
11:01
+ (15) правда это только по прогрессбару на сервере :(
17 Nikoss
 
25.01.13
11:11
(14), так она так и есть
18 Nikoss
 
25.01.13
11:12
(13), как это поможет?
19 Reset
 
25.01.13
11:34
(18) Он предлагает аналог (5) (преобразовав файл в строку и, разбив её, передавать по частям)
20 Ayvengo
 
25.01.13
11:35
Мне кажется, что это изврат :) Проще внешнюю компоненту какую-нибудь стырить или написать ;)
21 hhhh
 
25.01.13
11:49
можно по предыдущим загрузкам собрать статистику и потом выводить прогресс-бар по секундам
22 Nikoss
 
25.01.13
12:19
(21), не, такой вариант мне вообще не нравится. Именно хочется видеть как идет загрузка в реале. Часто бывает что интернет лагнет и тонки виснет наглухо, и не понятно то ли он все еще файл грузит, то ли повис.
23 Nikoss
 
25.01.13
12:21
Как думаете, если сделать вот этим:
Base64Строка()
Base64Значение()

Разбить строку на 10 частей, перекинуть на сервер с выводом прогресс бара по 10%. На сколько это увеличит время работы?
24 Reset
 
25.01.13
12:22
(23) На время преобразования туда/сюда + накладные расходы на 9 лишних вызовов сервара
25 oleg_km
 
25.01.13
12:24
Вообщето есть функция РазделитьФайл и ОбъединитьФайлы если это так нужно
26 Nikoss
 
25.01.13
13:13
(24) ну так вот я и спрашиваю, на сколько это увеличит время. Или так не получится даже примерно прикинуть? Если на 20-%, то думаю не критично.
27 zladenuw
 
25.01.13
13:17
(0) может для клиента который загружает файл хранить его статус обработки. на сервере вносишь. клиенту отображаешь.
28 H A D G E H O G s
 
25.01.13
13:21
(26) На проценты.
29 H A D G E H O G s
 
25.01.13
13:22
(25) Нильзя.
30 acsent
 
25.01.13
13:23
вообще то бейз 64 в 2 раза больше чем сырые данные
31 Kreont
 
25.01.13
13:24
А через метод системы не получится сделать копирование, что б ОСь сама показала окно копирования?
32 H A D G E H O G s
 
25.01.13
13:24
(30) в 1,33333 раза
33 H A D G E H O G s
 
25.01.13
13:25
(30) Но и жмуться они точно также лучше.
34 H A D G E H O G s
 
25.01.13
13:25
(31) Колосок мне в носок, гениально!
35 zladenuw
 
25.01.13
13:28
(31) а отмену запретить можно ?
36 Kreont
 
25.01.13
13:30
Да я так просто как вариант предложил, самому пока не надо :)

Хотя хоть на делфи+гугль можно прогу написать за 5 мин., с параметрами откуда, куда, и с запретом отмены.
37 H A D G E H O G s
 
25.01.13
13:35
(35) (36) ППЦ лютый.
38 Ахиллес
 
25.01.13
13:42
А Если порезать бинарник RARом например, без сжатия, чтоб побыстрее. Порежет быстро, можно хоть на 100 частей порезать, за свободным местом только на диске следить надо если файл большой.
39 oleg_km
 
25.01.13
13:55
(29) Почему нельзя, тонкий клиент сервер вроде можно?
40 H A D G E H O G s
 
25.01.13
14:01
(39)  Есть еще веб клиент.
41 Nikoss
 
28.01.13
11:48
&НаКлиенте
Процедура ОтправитьФайлНаСервер(Команда)
   
   ДиалогОткрытияФайла = МодульНаКлиенте.ДиалогВыбораФайлаНаКлиенте();
   
   Если ДиалогОткрытияФайла.Выбрать() Тогда
       ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ДиалогОткрытияФайла.ПолноеИмяФайла);
       СтрокаBase64Файла = Base64Строка(ДвоичныеДанныеФайла);
       Делитель = Окр(СтрДлина(СтрокаBase64Файла) / 10) + 1;
       К = 1;
       Состояние("Загрузка файла на сервер...", 0);
       Для Н = 1 По 10 Цикл
           
           НаСервер(Сред(СтрокаBase64Файла, К, Делитель), УникальныйИдентификатор, Н);
           Состояние("Загрузка файла на сервер...", Н * 10);
           К = К + Делитель;
           
       КонецЦикла;
       ВосстановитьИЗаписатьФайл(УникальныйИдентификатор);
   КонецЕсли;
   
КонецПроцедуры

&НаСервереБезКонтекста
Процедура НаСервер(ЧастьСтроки, УникальныйИдентификатор, НомерПакета)
   МенЗап = РегистрыСведений.ПробныйРегBase.СоздатьМенеджерЗаписи();
   МенЗап.УникальныйИдентификатор = УникальныйИдентификатор;
   МенЗап.НомерПакета = НомерПакета;
   МенЗап.Строка = ЧастьСтроки;
   МенЗап.Записать();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВосстановитьИЗаписатьФайл(УникальныйИдентификатор)

   Запрос = Новый Запрос;
   Запрос.Текст =
       "ВЫБРАТЬ
       |    ПробныйРегBase.НомерПакета КАК НомерПакета,
       |    ПробныйРегBase.Строка
       |ИЗ
       |    РегистрСведений.ПробныйРегBase КАК ПробныйРегBase
       |ГДЕ
       |    ПробныйРегBase.УникальныйИдентификатор = &УникальныйИдентификатор
       |
       |УПОРЯДОЧИТЬ ПО
       |    НомерПакета";

   Запрос.УстановитьПараметр("УникальныйИдентификатор", УникальныйИдентификатор);

   Результат = Запрос.Выполнить();

   ВыборкаДетальныеЗаписи = Результат.Выбрать();
   СтрокаДляВосстановления = "";
   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
       СтрокаДляВосстановления = СтрокаДляВосстановления + ВыборкаДетальныеЗаписи.Строка;
   КонецЦикла;
   
   ДвоичныеДанные = Base64Значение(СтрокаДляВосстановления);
   
   Если ДвоичныеДанные <> Неопределено Тогда
       ДвоичныеДанные.Записать("C:\1111\ляляля.png");
   КонецЕсли;
КонецПроцедуры


Собственно так все работает. Только писать в регистр - это бред. Как можно по другому? Какую то "хитрую" переменную создать?
42 Nikoss
 
28.01.13
11:59
Странно как-то себя ведет сообщение (41), если просто зайти в тему, его не видно, нужно жать "Все сообщения"... или это у меня лагает что-то?
43 Cube
 
28.01.13
12:01
(41) Так тебе же в хранилище надо писать? Ну так и пиши в хранилище. Проверка успешности загрузки проста: Если в хранилище строка, то недогрузили.
44 H A D G E H O G s
 
28.01.13
12:01
(41) Открой для себя ВременноеХранилище.
45 H A D G E H O G s
 
28.01.13
12:02
И ни в чем себе не отказывай.
46 Nikoss
 
28.01.13
12:22
&НаСервереБезКонтекста
Процедура НаСервер(ЧастьСтроки, УникальныйИдентификатор)
   ПоместитьВоВременноеХранилище(ЧастьСтроки, УникальныйИдентификатор);
   СодержимоеВременногоХранилища = ПолучитьИзВременногоХранилища(УникальныйИдентификатор);
КонецПроцедуры

На ПолучитьИзВременногоХранилища ругается - не правильный путь к файлу... что не так?
47 Nikoss
 
28.01.13
12:24
(46), ай... не дочитал СП... отбой.
48 Nikoss
 
28.01.13
14:44
что-то все совсем печально по скорости
49 H A D G E H O G s
 
28.01.13
15:11
(48) Если у тебя, когда нажимаешь "О программе" видно, что
Режим: Веб-сервер (сжатие: усиленное)

то все должно быть нормально.
50 Nikoss
 
28.01.13
15:43
Так если у меня локально разница в 3-5 раз, не думаю что какое-то сжатие поможет. Или я ошибаюсь? Просто нормально не получается по тестить на веб, интернет не стабильный.
51 zladenuw
 
28.01.13
15:45
(50) так в настройках поставь имитировать задержку. и проверяй  локально.
52 H A D G E H O G s
 
28.01.13
15:49
(51) Локально - сжатия не будет.
Программист всегда исправляет последнюю ошибку.