|   |   | 
| 
 | Загрузка файла на сервер, прогресс | ☑ | ||
|---|---|---|---|---|
| 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) Локально - сжатия не будет.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |