Тебе теория нужна, или просто записать?
Если просто записать, то бери COS - все проблемы решаться.
Теория изложена в rfc2616. В двух словах всех делов - распарсить заголовки.
Запись на Web сервер
Модератор: Absurd
Я наверное немного некоректно задал вопрос, в общем мне необходимо отправить файл на другую машину находящуюся в той же локальной сети. На той машине крутится Web сервер. В принципе я должен поместить файл в одну из директорий Web сервера.
Я так понимаю нужно воспользоваться классом URLConnection, но у меня не получается записать файл в поток.
Я так понимаю нужно воспользоваться классом URLConnection, но у меня не получается записать файл в поток.
Так очень всё просто. Файл считываешь каким-нибудь InputStreamReader'ом и параллельно отправляешь в поток urlConnection.getOutputStream(). Reader'ы и Writer'ы выбирай сам. я уже не помню, чем они друг от друго отличаются.но у меня не получается записать файл в поток.
Да действительно мне тоже поначалу показалось просто, но до сих пор ничего не сделал. Дело в том, что файл на сервере не появляется.
Методом URLConnection.getOutputStream() получаю выходной поток, пишу туда, но ничего не появляется. Я так понимаю, чтобы файл появился нужно использовать FileOutputStream. но как его увязать с URLConnection.getOutputStream() , не понимаю.
Методом URLConnection.getOutputStream() получаю выходной поток, пишу туда, но ничего не появляется. Я так понимаю, чтобы файл появился нужно использовать FileOutputStream. но как его увязать с URLConnection.getOutputStream() , не понимаю.
Сильное утверждениеДело в том, что файл на сервере не появляется.

Каким образом файл на сервере принимается?
Там стоит полноценный обработчик, который ждёт данные переданные методом POST или же там твоя же ответная часть,
которая просто берёт данные из стрима и в файл складывает?
Как не трудно догадаться я привёл пример для второго варианта.
А у тебя очень похоже на то, что первый вариант. В таком случае нужно
а) правильно сформировать заголовки
б) скорее всего твой файл завернуть в Base64.
Не очень уверен, что через URLConnection можно управлять заголовками. Поэтому копать видимо нужно в сторону Socket'ов.
Всё, более-менее основы вспомнил.
Итак, тонкости для передачи файла на сервер.
Заголовки, обязательные для заполнения:
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() Как минимум для отладки весьма полезно
.
Вот вроде бы и всё.
З.Ы: есс-но параметры "формы" нужно согласовать с ожидаемыми на сервере.
Итак, тонкости для передачи файла на сервер.
Заголовки, обязательные для заполнения:
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() Как минимум для отладки весьма полезно

Вот вроде бы и всё.
З.Ы: есс-но параметры "формы" нужно согласовать с ожидаемыми на сервере.
Привет еще раз, спасибо за мощную раскладку, но я думаю что я недосказал, что
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();
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();
Простой Apache файлы принимать не будетWeb сервер то простой Apache, не сервлет контейнер.

Если всё в локалке, то зачем же ты хочешь через HTTP ходить?//А мне нужно этот файл создать на http://www.olainfarm.lv/olainfarm/tsi , в нашей локали на другой машине
Замапь сетевой диск и работай как с обычным файлом.