Запись на Web сервер

Модератор: Absurd

Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

18 фев 2004, 14:12

Тебе теория нужна, или просто записать?
Если просто записать, то бери COS - все проблемы решаться.

Теория изложена в rfc2616. В двух словах всех делов - распарсить заголовки.
Armagid
Сообщения: 14
Зарегистрирован: 18 фев 2004, 11:18
Откуда: Рига

18 фев 2004, 16:44

Я наверное немного некоректно задал вопрос, в общем мне необходимо отправить файл на другую машину находящуюся в той же локальной сети. На той машине крутится Web сервер. В принципе я должен поместить файл в одну из директорий Web сервера.
Я так понимаю нужно воспользоваться классом URLConnection, но у меня не получается записать файл в поток.
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

18 фев 2004, 17:09

но у меня не получается записать файл в поток.
Так очень всё просто. Файл считываешь каким-нибудь InputStreamReader'ом и параллельно отправляешь в поток urlConnection.getOutputStream(). Reader'ы и Writer'ы выбирай сам. я уже не помню, чем они друг от друго отличаются.
Armagid
Сообщения: 14
Зарегистрирован: 18 фев 2004, 11:18
Откуда: Рига

18 фев 2004, 18:44

Да действительно мне тоже поначалу показалось просто, но до сих пор ничего не сделал. Дело в том, что файл на сервере не появляется.
Методом URLConnection.getOutputStream() получаю выходной поток, пишу туда, но ничего не появляется. Я так понимаю, чтобы файл появился нужно использовать FileOutputStream. но как его увязать с URLConnection.getOutputStream() , не понимаю.
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

18 фев 2004, 18:57

Дело в том, что файл на сервере не появляется.
Сильное утверждение :)

Каким образом файл на сервере принимается?
Там стоит полноценный обработчик, который ждёт данные переданные методом POST или же там твоя же ответная часть,
которая просто берёт данные из стрима и в файл складывает?

Как не трудно догадаться я привёл пример для второго варианта.

А у тебя очень похоже на то, что первый вариант. В таком случае нужно
а) правильно сформировать заголовки
б) скорее всего твой файл завернуть в Base64.

Не очень уверен, что через URLConnection можно управлять заголовками. Поэтому копать видимо нужно в сторону Socket'ов.
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

18 фев 2004, 19:45

Всё, более-менее основы вспомнил.

Итак, тонкости для передачи файла на сервер.

Заголовки, обязательные для заполнения:
Content-type. Это почти всегда
application/x-www-form-urlencoded (может быть и другой)

Content-length. Это размер всех данных, отправляемых на сервер.

Заголовки устанавливаются методом setRequestProperty.

Итого план действий:
Открыть коннекцию.
Отсигнализировать, что будем отправлять данные:
setDoOutput (true)

Считать файл в строку. Закодировать при помощи URLEncoder.encode().
Записать в какой-нибудь OutputStream параметры "формы" в виде
name1 = value1&file=filestring.
Параметры лучше называть только при помощи alphanumeric, значения - обяательно кодировать.


Установить заголовки коннекции, причём в Content-length пойдёт длина стрима, получаемая его методом size().

Переписать наш стрим в стрим коннекции при помощи writeTo.
OurStream.writeTo(connection.getOutputStream());

По желанию почитать ответ сервера из connection.getInputStream() Как минимум для отладки весьма полезно :) .

Вот вроде бы и всё.
З.Ы: есс-но параметры "формы" нужно согласовать с ожидаемыми на сервере.
Armagid
Сообщения: 14
Зарегистрирован: 18 фев 2004, 11:18
Откуда: Рига

19 фев 2004, 12:02

Привет еще раз, спасибо за мощную раскладку, но я думаю что я недосказал, что
Web сервер то простой Apache, не сервлет контейнер.

Вот мой вариант:
//Файл text.txt беру с сервера во входной поток
urls=new URL("http://www.olainfarm.lv/olainfarm/diriktory/text.txt");
//Вот сюда мне надо записать на тот же Apache простой сервер только в другую директорию
urlc=new URL("http://www.olainfarm.lv/olainfarm/tsi/");
URLConnection urlconn=urlc.openConnection();
urlconn.setDoOutput(true);
InputStream is=urls.openStream();
//Если пишу так, то файл создается, у меня локально, все нормально
FileOutputStream fos=new FileOutputStream(file);
//А мне нужно этот файл создать на http://www.olainfarm.lv/olainfarm/tsi , в нашей локали на другой машине
//OutputStream fos=urlconn.getOutputStream();
int b;
while((b=is.read()) != -1) fos.write(b);
fos.close();
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

19 фев 2004, 13:36

Web сервер то простой Apache, не сервлет контейнер.
Простой Apache файлы принимать не будет :) . На серверной стороне должен быть либо CGI скрипт, либо Servlet либо ещё что-то, что примет от тебя файл.
//А мне нужно этот файл создать на http://www.olainfarm.lv/olainfarm/tsi , в нашей локали на другой машине
Если всё в локалке, то зачем же ты хочешь через HTTP ходить?
Замапь сетевой диск и работай как с обычным файлом.
Ответить