Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Апплеты > upload |
Автор: Gugle 18.3.2008, 17:30 | ||
Доброго времени суток! Подскажите как реализовать передачу файла на сервер через Applet? Нашел пакет fileupload для servlet. Но как сформировать метод post в apllet не понимаю. Может кто подскажет как реализовать эту форму в applet-е?
|
Автор: LSD 18.3.2008, 17:38 |
Для того чтобы апплет мог работать с файлами его придется подписать. Плюс там есть заморочки с установленностью JVM. Оно тебе реально надо грузить файлы апплетом? |
Автор: Gugle 18.3.2008, 17:44 | ||||
Подписать не проблема.
Это про что?
Хотелось бы. Альтернатива типа перехода на страницу загрузки (как например кот я выложил) возможна, но как на jsp написать красивый загрузчик я незнаю, т.к. не знаю jsp. |
Автор: Gugle 18.3.2008, 18:03 | ||||
Проблемы клиента. ![]()
Хммм... Почти уговорил. ![]() А если честно интересно просто как можно это в аплете реализовать. Неужели передача файла так трудно? Или методом post нельзя в апплете сформировать такую посылку как в html который представлен выше? |
Автор: LSD 18.3.2008, 18:22 | ||||
Да нет, если использовать например http://hc.apache.org/httpclient-3.x/index.html то элементарно:
только это как микроскопом гвозди забивать. Добавлено через 3 минуты и 15 секунд На самом деле твои, ибо если не будет работать или клиент придет с вопросами к тебе. Или вообще уйдет к конкуренту. |
Автор: Gugle 19.3.2008, 10:49 | ||||||
![]()
Возвращает error:
Не могу понять что хочет. Вместо "http://host/some_path", ввел путь к своему серверу который должен принять файл. Он вообще никак не реагирует. |
Автор: LSD 19.3.2008, 11:01 |
http://hc.apache.org/httpclient-3.x/dependencies.html (junit нужен только для запуска тестов). |
Автор: Gugle 19.3.2008, 12:13 | ||
Чего то я запутался.
|
Автор: LSD 19.3.2008, 12:20 |
И что тебе не понятно? После выполнения executeMethod() ты получишь код ответа от сервера (коды описаны в HttpStatus) или ексепшн если сервер не ответит или ответ будет неправильным (не соответвовать спецификации HTTP протокола). |
Автор: Gugle 19.3.2008, 12:36 |
Сервак НеАлё!!! Добавлено @ 12:37 А статус что Алё. Код статуса 200, т.е. ОК! |
Автор: LSD 19.3.2008, 12:38 |
А ты уверен что сервак работает правильно? |
Автор: Gugle 19.3.2008, 12:40 |
Так сервер отвечает при обращении к нему из формы. ![]() Ладно чет с серваком. Пошел разбираться. LSD Спасибо! PS На + нажал. ![]() |
Автор: Gugle 19.3.2008, 15:35 |
Возвращаясь к баранам. Можно как нить посмотреть сколько передано? |
Автор: LSD 19.3.2008, 16:12 |
Создаешь свой класс унаследованный от FilePart, в нем переопределяешь метод sendData() где и считаешь количество переданых байт. |
Автор: Gugle 20.3.2008, 12:15 |
А можно на сервере смотреть сколько получено и отправлять их клиенту во время приема данных? |
Автор: LSD 20.3.2008, 12:59 | ||
Не знаю, что ты используешь на сервере для приема. Но вообще такое реализовать можно. |
Автор: Gugle 20.3.2008, 13:10 | ||
На серваке работает tomcat. Принимаю вот так:
Принимаю файл с использование пакета fileupload. Подскажи плз где надо поставить счетчик принятых байт. |
Автор: LSD 20.3.2008, 14:26 |
Где тут у тебя непосредственно загрузка файла? Ты из FileItem должен получить getInputStream() и когда будешь читать из него, считать количество принятых байт. |
Автор: Gugle 20.3.2008, 15:18 | ||
Загрузка идет во время сохранения файла:
Эээ.. ![]() |
Автор: LSD 20.3.2008, 15:24 |
Пиши вручную, InputStream у тебя уже есть, создай FileOutputStream и пиши туда. Заодно считай сколько записано байт. |
Автор: Gugle 20.3.2008, 16:35 | ||||||||
Вывод в консоль получил. Еще пара вопросиков. 1. Вот тут веть то же происходит считывание данных?
Отловить процесс можно как нить? 2. На приемной стороне как получать ответы? Веть надо создать поток InputStream(), а
не возвращает входной поток. Нету такого метода у PostMetod
3. С сервера данные отправлять лучше через?
|
Автор: LSD 20.3.2008, 16:47 |
Нет не происходит. Создав новое соединение. HTTP не позволяет в рамках одной сессии паралельно выпонлнять несколько запросов. Лучше или обычный HTTP или свой простенький протокол. |
Автор: Gugle 20.3.2008, 17:02 | ||
А если я новое http соединение создам он разве будет принимать данные от соединения?
Добавлено через 1 минуту и 40 секунд Сервер веть должен отвечать по этому соединению. |
Автор: LSD 20.3.2008, 17:07 |
Кому это он должен и сколько? ![]() Почитай уже описание того как работает HTTP. |
Автор: Gugle 20.3.2008, 17:07 | ||||
Веть при создании
мы открываем вых поток
и должны получить входной для проверки буфера. |
Автор: LSD 20.3.2008, 17:14 |
Ты получишь результат выполнения HTTP запроса, и только после того как он выполнится. |
Автор: Gugle 20.3.2008, 17:54 |
Все. Понял о чем речь. Прошу прощения за свою глупость... З.Ы. Ушел просвещаться. |
Автор: Gugle 20.3.2008, 18:30 |
Просто да или нет. ![]() Отправляя даннные, я могу посмотреть сколько я отправил, НО в этой "сессии" ("соединении") НЕ сколько принял. Либо сколько я принял, НО в этой "сесии" я не могу сообщить клиенту сколько я принял ПОКА я не приму данные полностью. Используя ОДИН метод POST. Учитывая это я могу передавать данные методом POST, и в этой "сессии" клиент знает сколько данных НЕ ТОЛЬКО ПРИНЯТО НО И ПОЛУЧЕНО используя метод GET, ЕСЛИ сервер умеет сообщать об этом. Для этого я должен сервер научить так делать передая ему некоторый контент. |
Автор: LSD 20.3.2008, 18:38 |
Вообще ничего не понял. |
Автор: Gugle 20.3.2008, 19:07 | ||
Плохо. Значит из того что я прочитал я не сделал ни одного верного вывода. ![]() ![]() ![]() ![]() Добавлено через 12 минут и 9 секунд Значит. Сделав следующий запрос к сервеу:
Я не могу получить от него ответа пока он не завершиться. Т.е. обязан дождаться передачи всего файлн и только после этого я получу подтверждение принял я его или нет. Тогда как я могу получить подстверждение принятого байта? З.Ы. Сорь. Ламер в этих вопросах. |
Автор: LSD 20.3.2008, 19:38 |
Тебе надо или реализовать еще один сервлет, который по запросу будет возвращать количество байт загруженных в текущей сессии (т.е. тебе надо будет или хранить в сессии это число или сделать механизм который позволит его получить по ID сессии). Либо вообще забить на POST, и реализовать свой сервлет (не HTTP!), который бы принимал данные по собственному протоколу и переодически слал бы данные о принятом количестве байт. |
Автор: Gugle 25.3.2008, 10:21 |
Почему то не обновляется диалоговое окно прогресса в аплете. При этом если появление диалогового окна положить в метод init() аплета то все нормально, а если в обработчик нажатия на кнопку, то диалог появляется, но не обновляется. Использую стандартное окно ProgressMonitor. В чем может быть проблема? |
Автор: Gugle 25.3.2008, 10:55 |
Да, кстати, все расчеты происходят в отдельном потоке. (В данном случае отправка файла) |
Автор: LSD 25.3.2008, 12:27 |
Покажи код. |
Автор: Gugle 25.3.2008, 12:42 | ||||
Applet:
Код загрузчика:
|
Автор: LSD 25.3.2008, 13:19 |
Ну и где тут у тебя отправка происходит в отдельно потоке? Все работает в AWT потоке, потому ничего и не перерисовывается. Вынеси загрузку файла на сервер в отдельный поток. |
Автор: Gugle 25.3.2008, 14:50 | ||||
Вынес все в отдельный поток.
Ничего не изменилось. Или я не верно делаю? |
Автор: LSD 25.3.2008, 15:25 |
Блин! Ну нафига надо ожидать пока тот поток завершиться? В чем тогда вообще смысл выносить выполнение это операции в отдельный поток, если основной поток все равно будет ждать пока вспомогательный завершиться? Ты должен запустить поток и выйти з метода. Когда поток завершит загрузку пусть вызовет некий метод который сделает необходимые действия (покажет сообщение и т.п.). В этом же потоке обновляй значение прогресбара по мере продвижения загрузки. Только не забывай, что все изменения GUI из других потоков надо делать через SwingUtilities.invokeLater(). |
Автор: Gugle 25.3.2008, 15:59 | ||||
Так основной поток рождает диалоговое окно которое говорит пользователю, что он должен ожидать окончания загрузки файла. При этом я должен как то заполнять progressBar, вот я и создаю доп. поток который передает файл и при этом из которого я вытаскиваю количество переданной информации. Основной поток при этом должен так же ожидать загрузки файла на сервер. Разве при этом обновление progressBar рожденного в основном потоке не должно происходить?
А зачем мне ждать когда поток завершит загрузку? Веть мне надо показать progressBar именно во время загрузки файла. Добавлено через 1 минуту и 14 секунд А так же показывать сколько % загружено. |
Автор: LSD 25.3.2008, 17:45 |
Ты вызываешь загрузку из обработчика события AWT. Пока ты не выйдешь из этого обработчика не будет происходить никакая обработка событий GUI, ничего не будет перерисовываться, окошки не будут открываться/закрываться и т.д. Именно для этого и нужен отдельный поток, чтобы сразу после его запуска вернуть управление AWT. |
Автор: Gugle 26.3.2008, 12:27 |
Спасибки. |
Автор: emelanov 8.4.2008, 22:38 | ||
LSD, День добрый, у меня такая же проблема, только вместо апплета вебстарт (т.е. вебстарт-эдитор для определённого вида xml-файлов, должен уметь сохранять готовые на родном сервере), думаю воспользоваться этим же решением. Вопрос: это тоже будет :"
т.е. существует ли более красивое решение? |
Автор: LSD 9.4.2008, 11:19 | ||
В твоем случае - нет не будет. Дело в том, что Gugle, делал апплет предназначенный только для загрузки файлов на сервер, хотя подобный функционал можно реализовать и без применения апплета. У тебя же есть готовое приложение и ты просто добавляешь в него некий функционал. Что лучше использовать HTTP POST или свой собственный протокол - вопрос открытый. С одной стороны HTTP POST проще реализовывать серверную часть и нет привязки к языку программирования, очень нетребователен к соединению (если клиент сидит за firewall, proxy, NAT). Свой протоколо - более гибкий (например позволяет реализовать докачку, сжатие передаваемых данных и т.п.), позволяет обойтись одним соединением для получения прогресса загрузки (в случае с HTTP POST, нужно одно для загрузки, и еще куча запросов на выяснение сколько было уже загружено). |
Автор: emelanov 9.4.2008, 11:38 |
ок, спасибо. Думаю, мне HTTP POST подойдёт, так как мне не нужны проценты, файлы будут довольно мелкие, по любому меньше Mb. |