|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
Блок А.Н.DAiMor, Хм. Я пробовал изменять значение input type=file и сабмитить, но это не работает. Про то, что можно создать уже заполненную страницу и сабмитить ее, я даже не подумал. А выбор нескольких файлов делается как, в общих словах? атрибут multiple для input ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 12:01 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
Блок А.Н., программно заполнить именем файла элемент input нельзя - такая возможность исключена во всех браузерах по соображениям безопасности. В самом деле, в этом случае браузер мог бы сам, втайне от пользователя, создавать инпуты, тянуть с компа какие-то файлы и отправлять их на сервер. Поэтому выбрать файл можно только вручную, через файловый диалог. Если, конечно, Вы именно это имели в виду. Атрибут multiple работает во всех броузерах, кроме IE, во всяком случае, в 8 версии точно не поддерживается, в 9 - не пробовал. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 12:33 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
EvLaUyБлок А.Н., программно заполнить именем файла элемент input нельзя - такая возможность исключена во всех браузерах по соображениям безопасности. В самом деле, в этом случае браузер мог бы сам, втайне от пользователя, создавать инпуты, тянуть с компа какие-то файлы и отправлять их на сервер. Поэтому выбрать файл можно только вручную, через файловый диалог. Если, конечно, Вы именно это имели в виду. Атрибут multiple работает во всех броузерах, кроме IE, во всяком случае, в 8 версии точно не поддерживается, в 9 - не пробовал. под программным заполнением я имел ввиду, копирование dom, т.е. получаем объект поля через getElementById, и копируем его в форму через appendChild по приведенной мной ссылке про multiple, начиная с IE10, и все остальные большие браузеры, на мобильных тоже не доступен ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 12:39 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
Методика, описанная в ссылке, которую я дал в этом же посте выше, работает. Во всяком случае, у меня получилось. Есть только нюанс в серверном приеме файла в Cache. Ранее (в Cache2009) без проблем работала следующая конструкция: file.Write(obj.Read(obj.Size)), где file - экземпляр класса %Library.File, obj - поток, в которой считан файл из %request. А в Cache2012 - не работает! Файл на диск записывается с искажениями, размер не соответствует оригиналу. Помогло использование %Stream.FileBinary согласно образцу, подсказанному servit'ом, в посте, заведенном в январе этого года krvsa. http://www.sql.ru/forum/actualthread.aspx?tid=908620&hl= krvsa этот вариант понравился (еще бы!), мне тоже. Всем нравится то, что работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 12:42 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
искажения возможны если где то используется CharacterStream, из-за чего он может его конвертировать на лету, для бинарных файлов конечно такое опасно конструкцию вида Код: plaintext
это потенциально приведет к ошибке для копирования стримов, есть метод CopyFrom ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 12:50 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
DAiMor, наверное, нельзя. Только где, в каком авторитетном источнике по Cache это можно прочитать? В документации? Эх-хе-хе, нету там ничего. В книжках? Раз-два и обчелся, да и там такого тоже нет. И опять-таки - а почему нельзя? Я уже написал, что в Cache2009 это работало совершенно безукоризненно, я не помню проблем. Откуда бедному cache-программисту черпать знания? В этом плане наш форум, конечно, бесценная вещь. Когда-то выходили объемистые компьютерные книги в серии "Секреты...", например, "Секреты Unix", "Секреты Word" и пр. Вот нашелся бы кто-нибудь, кто на основе обширных материалов этого форума написал бы книгу "Секреты Cache" (про секреты Ensemble уже и не говорю, эта тема на форуме менее популярна). Цены бы не было. Осталось за малым - чтобы кто-то за это взялся - раз, и кто-то проспонсировал - два. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 13:01 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
на счет нельзя, подсказывает просто здравый смысл, ведь это неминуемо приведет к ошибке если размер файла превысит допустимой длины строки я если бы увидел такое в коде сразу же переписал как переписываю и конструкции вида while 'stream.AtEnd { w stream.Read() } на d stream.OutputToDevice() ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 13:07 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
а из книжек, я читал только документацию по MUMPS которую мне давал почитать krvsa, когда я пришел к нему работать дальше мне хватает стандартной документации и личного опыта ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 13:10 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
DAiMor, разумеется, мне это здравый смысл тоже подсказал. И я пробовал читать и писать в файл в цикле, порциями по 30 Кб. С тем же успехом. Причем аргумент, передаваемый по ссылке в Read, всегда правильно возвращал количество считанных символов, и общая длина obj соответствовала оригиналу. А в итоге записывалось все равно с искажениями. Что-то, видимо, изменилось в реализации File. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 13:14 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
DAiMor, ой, а как же мне не хватает ни того, ни другого. Есть, правда, еще WRC, когда-то хорошо выручало, но меня оттуда сразу же выбросили, как только моя основная работа перестала быть связана с Cache. Вот уж, как говорится, друг познается в беде. Сейчас - удаленная подработка, поэтому нет особенно времени самому ковырять плохо документированные вещи, когда-то, однако, надо и жить. Ну а своего бывшего начальника krvsa Вы давно уже обошли, как я понимаю. Вы уже несколько лет живете и успешно работаете в Москве. krvsa эту задачу решить так и не удалось. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 13:35 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
DAiMor я читал только документацию по MUMPS которую мне давал почитать krvsaСкорее всего, это была документация по MSM, которую мы когда-то перевели :) Сегодня подобных книг практически не найти, да и устарели они, а потребность осталась. Наверное, мало кто заметил, что в этом году в Штатах вышла новая книга . ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 13:37 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
EvLaUyDAiMor, наверное, нельзя. Только где, в каком авторитетном источнике по Cache это можно прочитать? В документации? Эх-хе-хе, нету там ничего. В книжках? Раз-два и обчелся, да и там такого тоже нет. И опять-таки - а почему нельзя? Я уже написал, что в Cache2009 это работало совершенно безукоризненно, я не помню проблем. Откуда бедному cache-программисту черпать знания? В этом плане наш форум, конечно, бесценная вещь. Когда-то выходили объемистые компьютерные книги в серии "Секреты...", например, "Секреты Unix", "Секреты Word" и пр. Вот нашелся бы кто-нибудь, кто на основе обширных материалов этого форума написал бы книгу "Секреты Cache" (про секреты Ensemble уже и не говорю, эта тема на форуме менее популярна). Цены бы не было. Осталось за малым - чтобы кто-то за это взялся - раз, и кто-то проспонсировал - два. Проспонсируем, если возьмется кто. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 13:47 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
Alexey MaslovDAiMor я читал только документацию по MUMPS которую мне давал почитать krvsaСкорее всего, это была документация по MSM, которую мы когда-то перевели :) Сегодня подобных книг практически не найти, да и устарели они, а потребность осталась. Наверное, мало кто заметил, что в этом году в Штатах вышла новая книга . В нашем офисе она уже есть. Если у уважаемого сообщества будут заказы - можем собрать и купить сразу много, для всех желающих. Это нужно? Заказы собираем? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 13:49 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
Евгений, Перевод на русский планируется? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 13:55 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
Alexey MaslovЕвгений, Перевод на русский планируется? Пока нет - ждем появления русских писателей. И еще по этой книге нужны отзывы - кто готов написать, книгу бесплатно дадим. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 14:14 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
Евгений, готов написать отзыв. Жду книгу :) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 14:29 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
Шваров ЕвгенийПока нет - ждем появления русских писателей.Это правильно, пусть русские писатели напишут сразу же по-русски - тогда и переводить не придётся. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 14:31 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
Вот это я удачно свернул в сторону от изначальной темы поста. Может быть, пришло время отдельную тему завести? Мне кажется, вопрос того стоит. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 14:33 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
Шваров Евгений, я тоже готов написать отзыв, но за халявой не гонюсь. Согласен приобрести книгу за установленную плату. Но вам ведь для этого нужно какой-то минимальный объем заказа набрать? Эх.. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 14:36 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
EvLaUyШваров Евгений, я тоже готов написать отзыв, но за халявой не гонюсь. Согласен приобрести книгу за установленную плату. Но вам ведь для этого нужно какой-то минимальный объем заказа набрать? Эх.. Не нужен минимальный объем заказа. Но мы собираемся приобрести N-экземпляров для офиса в Москве и можем к ним добавить еще M-экземпляров для тех, кому книга реально нужна и не проблема ее забрать в нашем офисе и по каким-то причинам сложно приобрести тут . Мы уже приобретали именно там, книга доставляется по адресу, все ок. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 15:02 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
Шваров Евгений, хорошо, Евгений, когда можно будет подходить в офис с деньгами, сообщите, пожалуйста, постом в форуме или на мой E-mail. Буду ждать. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 15:06 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
EvLaUyСкажите пожалуйста, можно ли с помощью гиперметода передать на сервер файл, выбранный пользователем в элементе <input type="file">? Т.е. тут проблема такая - что нужно вытащить из этого input и передать в качестве аргумента гиперметода и какой должен быть тип этого аргумента? И как принять на сервере имя файла и сам поток данных? Как принять из input'а файл на сервере по обычному submit'у формы я знаю и много раз успешно это делал, и в этом форуме эта техника неоднократно обсуждалась, а вот - гиперметод? И если не гиперметод - то, обобщая задачу, как передать на сервер файл без перезагрузки страницы, т.е. не submit'ом формы?Если использовать новые возможности HTML5 - XMLHttpRequest level 2 , File API и т.д. - всё это можно сделать даже без <input type="file"> . Сделал два "простых" (насколько мог) ZEN-примера без form, submit, iframe, jQuery, flash, java, перезагрузки/перерисовки страницы и c отображением прогресса по каждому загружаемому файлу. Асинхронная загрузка только одного файлаClass upload.fileOne Extends %ZEN.Component.page { Parameter DOMAIN = "SQL.RU"; XData Style { <style type="text/css"> </style> } XData Contents [ XMLNamespace = " http://www.intersystems.com/zen" ] { <page xmlns=" http://www.intersystems.com/zen" title="Загрузка файла, используя XMLHttpRequest" labelPosition="left"> <hgroup cellVAlign="bottom"> <fileUpload label="Выберите файл" id="fileToUpload" onchange="zenPage.fileSelected()"/> <button caption="Загрузить" onclick="zenPage.uploadFile();"/> </hgroup> <label id="fileType" label="Тип: "/> <label id="fileName" label="Имя: "/> <label id="fileSize" label="Размер: "/> <html> <div id="progressNumber">%</div> <progress id="progressValue" value="0" max="100.0"></progress> </html> </page> } ClientMethod uploadFile() [ Language = javascript ] { var fd = new FormData(); fd.append('fUpload', zen('fileToUpload').findElement('control').files[0]); var xhr = new XMLHttpRequest(); xhr.upload.addEventListener('progress', this.uploadProgress, false); xhr.addEventListener('load', this.uploadComplete, false); xhr.addEventListener('error', this.uploadFailed, false); xhr.addEventListener('abort', this.uploadCanceled, false); xhr.open('POST', 'upload.fileOne.cls'); xhr.send(fd); } ClientMethod uploadProgress(evt) [ Language = javascript ] { if (evt.lengthComputable) { var percentComplete = Math.round(evt.loaded * 100 / evt.total); document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%'; document.getElementById('progressValue').value = percentComplete; } else { document.getElementById('progressNumber').innerHTML = $$$Text('Не удаётся вычислить'); } } ClientMethod uploadComplete(evt) [ Language = javascript ] { zenAlert($$$Text('Загрузка завершена.')); } ClientMethod uploadFailed(evt) [ Language = javascript ] { zenAlert($$$Text('Произошла ошибка при попытке загрузить файл.')); } ClientMethod uploadCanceled(evt) [ Language = javascript ] { zenAlert($$$Text('Загрузка была отменена пользователем или браузер сбросил соединение.')); } ClientMethod fileSelected() [ Language = javascript ] { var file = zen('fileToUpload').findElement('control').files[0]; if (file) { var fileSize = 0; if (file.size > 1024 * 1024) fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + $$$Text('МБайт'); else fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + $$$Text('КБайт'); zenSetProp('fileType','value',file.type); zenSetProp('fileName','value',file.name); zenSetProp('fileSize','value',fileSize); } } ClassMethod %OnPreHTTP() As %Boolean [ ServerOnly = 1 ] { #dim %request As %CSP.Request #dim stream As %CSP.BinaryStream=%request.GetMimeData("fUpload") if $IsObject(stream) { #; делаем с полученным файлом полезную работу /* set ^tmp("filename")=stream.FileName set ^tmp("filesize")=stream.Size */ quit $$$NO } quit $$$YES } } Асинхронная загрузка сразу нескольких файловClass upload.fileMany Extends %ZEN.Component.page { Parameter DOMAIN = "SQL.RU"; XData Style { <style type="text/css"> .ok { color:green; } #dropZone { width: 360px; height: 125px; border: dashed 2px #ccc; background-color: #fefefe; color: #ccc; text-align: center; padding: 125px 0 0 0; } </style> } XData Contents [ XMLNamespace = " http://www.intersystems.com/zen" ] { <page xmlns=" http://www.intersystems.com/zen" title="Загрузка сразу нескольких файлов, используя XMLHttpRequest"> <html id="dropZone">Перетащите сюда файлы или воспользуйтесь кнопкой ниже</html> <hgroup cellVAlign="bottom"> <html id="selectFiles" label="Выберите файлы"> <input type="file" class="fileUpload" id="fileToUpload" onchange="zenPage.fileSelected(document.getElementById('fileToUpload').files)" multiple="multiple" /> </html> <button caption="Очистить" title="Очистка очереди" onclick="zenPage.clearList();"/> <spacer width="10"/> <button caption="Загрузить" title="Загрузка файлов на сервер" onclick="zenPage.uploadFile();"/> </hgroup> <fieldSet legend="Файлы, ожидающие загрузки"> <html id="holder"/> </fieldSet> </page> } ClientMethod clearList() [ Language = javascript ] { fileQueue=[]; zen('holder').getEnclosingDiv().innerHTML=''; zen('selectFiles').refreshContents(); } ClientMethod fileSelected(files) [ Language = javascript ] { var holder = zen('holder').getEnclosingDiv(); for (var i = 0; i < files.length; i++) { var file = files[i]; var fileSize = 0; if (file.size > 1024 * 1024) fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + $$$Text('МБайт'); else fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + $$$Text('КБайт'); var divInfo = document.createElement('div'); divInfo.innerHTML=file.name+' ('+file.type+') - '+fileSize; holder.appendChild(divInfo); var divProgN = document.createElement('div'); divProgN.id='progressNumber'+i; divProgN.innerHTML='%'; holder.appendChild(divProgN); var prog = document.createElement('progress'); prog.id='progressValue'+i; prog.max='100.0'; prog.value='0'; holder.appendChild(prog); fileQueue.push({i:i,file:file}); } } ClientMethod uploadFile() [ Language = javascript ] { while (fileQueue.length > 0) { var item=fileQueue.pop(); uploadFile(item.file,item.i); } } ClientMethod onloadHandler() [ Language = javascript ] { if (typeof FileReader == "undefined") zenAlert($$$Text('Извините, Ваш браузер не поддерживает File API, поэтому это демо не будет правильно работать')); fileQueue = new Array(); uploadFile = function (file, i) { var xhr = new XMLHttpRequest(), upload = xhr.upload, fd = new FormData(); fd.append('fUpload', file); upload.addEventListener('progress', function (evt) { if (evt.lengthComputable) { var percentComplete = Math.round(evt.loaded * 100 / evt.total); document.getElementById('progressNumber'+i).innerHTML = percentComplete.toString() + '%'; document.getElementById('progressValue'+i).value = percentComplete; } else { document.getElementById('progressNumber'+i).innerHTML = $$$Text('Не удаётся вычислить'); } }, false); upload.addEventListener('load', function (ev) { var c=document.getElementById('progressNumber'+i); c.className='ok'; c.innerHTML='OK'; }, false); upload.addEventListener('error', function (ev) {zenAlert($$$Text('Произошла ошибка при попытке загрузить файл.'));}, false); upload.addEventListener('abort', function (ev) {zenAlert($$$Text('Загрузка была отменена пользователем или браузер сбросил соединение.'));}, false); xhr.open('POST','upload.fileMany.cls'); xhr.setRequestHeader('Cache-Control', 'no-cache'); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.send(fd); } dropZone=zen('dropZone').getEnclosingDiv(); dropZone.addEventListener('dragenter', function(ev){ ev.stopPropagation(); ev.preventDefault(); }, false); dropZone.addEventListener('dragleave', function(ev){ ev.stopPropagation(); ev.preventDefault(); this.style['backgroundColor'] = '#FEFEFE'; this.style['borderColor'] = '#CCC'; this.style['color'] = '#CCC'; }, false); dropZone.addEventListener('dragover', function(ev){ ev.stopPropagation(); ev.preventDefault(); this.style['backgroundColor'] = '#F0FCF0'; this.style['borderColor'] = '#3DD13F'; this.style['color'] = '#3DD13F'; }, false); dropZone.addEventListener('drop', function(ev){ ev.stopPropagation(); ev.preventDefault(); this.style['backgroundColor'] = '#FEFEFE'; this.style['borderColor'] = '#CCC'; this.style['color'] = '#CCC'; zenPage.fileSelected(ev.dataTransfer.files); }, false); } ClassMethod %OnPreHTTP() As %Boolean [ ServerOnly = 1 ] { #dim %request As %CSP.Request #dim stream As %CSP.BinaryStream=%request.GetMimeData("fUpload") if $IsObject(stream) { #; делаем с полученным файлом полезную работу /* set ^tmp("filename")=stream.FileName set ^tmp("filesize")=stream.Size */ quit $$$NO } quit $$$YES } } ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 16:12 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
servit, большое спасибо, как всегда исчерпывающе. Будет полезно всем взять на вооружение. Что касается конкретно нас, мы еще не доросли до этих технологий. ZEN мы тоже не используем - аутсорсный верстальщик уже всё сверстал, дизайн и верстка утверждены, и я обязан ей следовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 16:28 |
|
Передача файлов на сервер с помощью гиперметода - is it possible?
|
|||
---|---|---|---|
#18+
EvLaUy, Переделать эти примеры на CSP не так уж сложно, мне кажется. Здесь проблема пока одна - поддержка старых браузеров. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2012, 16:36 |
|
|
start [/forum/topic.php?fid=39&msg=38037854&tid=1557308]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 156ms |
0 / 0 |