Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/47: Рейтинг темы: голосов - 47, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 02.08.2019
Сообщений: 13

Обмен файлами через idhttp и idhttpserver

02.08.2019, 11:35. Показов 9273. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть клиент-серверное приложение. Работает на idhttp и idhttpserver. Хочу добавить обмен файлами между приложениями (между сервером и клиентом).
Нужно отправить на сервер картинку и получить с сервера картинку.

Нужен пример как отправить на сервер картинку, и сервером её принять, и как отправить на сервер запрос, а сервер в ответ картинку, и клиентом её принять.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.08.2019, 11:35
Ответы с готовыми решениями:

Прокси-сервер (IdHTTPServer + IdHTTP)
нужно реализовать простой прокси-сервер (просто чтобы запросы браузера проходили через него): на форме IdHTTPServer1 (Active = true) ...

Обмен файлами и сообщениями через интернет
Мне надо сделать программу, которая будет обмениваться сообщениями с такой-же программой на другом компе.Мне надо будет передавать файлы(до...

Загружает код через tWebBrowser, но не через idHttp
Огромная печаль настигла меня. Есть ответ от сайта в формате jSon. ТЫК. Пост-запрос тут не нужен. И tWebBrowser спокойно отображает...

7
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
02.08.2019, 11:54
Лучший ответ Сообщение было отмечено Userzx как решение

Решение

В В IdHTTPServer1CommandGet пишем
Delphi
1
2
3
4
5
if (ARequestInfo.Document <> '/')  then //вместо (ARequestInfo.Document <> '/') можно поставить условие, при котором будет возвращать файл
  Begin
    AResponseInfo.ContentStream := TFileStream.Create(extractfilepath(paramstr(0))+ ARequestInfo.Document,fmOpenRead);
    exit;
  end;
0
0 / 0 / 0
Регистрация: 02.08.2019
Сообщений: 13
02.08.2019, 11:59  [ТС]
Это как я понял в сторону клиента. А как в сторону сервера?

Если можно немного подробнее, так как не селён в програмировании.
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
03.08.2019, 16:48
Цитата Сообщение от Userzx Посмотреть сообщение
Это как я понял в сторону клиента. А как в сторону сервера?
Скачивание файла IdHTTP

Цитата Сообщение от Userzx Посмотреть сообщение
Если можно немного подробнее, так как не селён в програмировании.
Конкретные вопросы будут приводить к конкретным ответам. Как показывает практика, без этих вопросов весь труд по объяснению, трате времени на написание кода и т.д. будет просто потрачено впустую.

Ну и вам надо понимать, что ваши вопросы элементарно ищутся в гугле вместе с работоспособным кодом.
0
0 / 0 / 0
Регистрация: 02.08.2019
Сообщений: 13
04.08.2019, 18:48  [ТС]
Со скачиванием с сервера я разобрался:
Клиент
Delphi
1
2
3
4
5
6
7
8
var
  m: TMemoryStream;
begin
  m:= TMemoryStream.Create;
  IdHttp1.Get ('http://127.0.0.1:8011/', m);
  m.SaveToFile('1.jpg');
  m.Free;
end;
Сервер (OnCommandGet)
Delphi
1
2
3
    AResponseInfo.ContentStream := TFileStream.Create('d:\1123.jpg', fmOpenRead or fmShareCompat);
    exit;
   //после exit ничего не делает, а мне нужно. КАК?
Вопросы?
1) Как выполнить что-то после exit в сервере, и почему БЕЗ exit программа намертво зависает?
2) Как правильно задать условие чтобы файл скачивался например по адресу, например так http://127.0.0.1:8011/MyFile
3) Самый главный вопрос: Как ЗАГРУЗИТЬ файл на сервер? (нужен пример)
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
05.08.2019, 04:02
Цитата Сообщение от Userzx Посмотреть сообщение
1) Как выполнить что-то после exit в сервере, и почему БЕЗ exit программа намертво зависает?
Нет кода - нет ответа. Код, который вы привели, зависать не должен. Соответственно, нужен тот код, который зависает.

Цитата Сообщение от Userzx Посмотреть сообщение
Как правильно задать условие чтобы файл скачивался например по адресу, например так http://127.0.0.1:8011/MyFile
Delphi
1
if (ARequestInfo.Document = '/MyFile')  then //вроде так. А вообще можно для этого использовать дебагер
Цитата Сообщение от Userzx Посмотреть сообщение
Самый главный вопрос: Как ЗАГРУЗИТЬ файл на сервер? (нужен пример)
Например, передавая через POST-запрос в виде base64, и на стороне сервера принимать через ARequestInfo.PostStream
0
0 / 0 / 0
Регистрация: 02.08.2019
Сообщений: 13
05.08.2019, 16:15  [ТС]
"Не должен" и "зависает" вещи разные.
Если запущен только сервер и делать запрос браузером то все ОК, но если IDHTTP в этом же приложении что и сервер то всё намертво. Привел выше пример кода который ИМЕННО ЗАВИСАЕТ, если убрать
Delphi
1
exit;
С ним всё ок, но мне нужно после отправки сервером файла, еще что-то выполнить. Вопрос как это сделать?

За
Delphi
1
if (ARequestInfo.Document = '/MyFile')  then
спасибо. Работает.

С отправкой файла на сервер разобрался. Вот пример:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
function decodeToBase64(FilePachName:string):string;
var
  Fs : TFileStream;
  S : AnsiString;
  //FileName : String;
begin
  //FileName := ExtractFilePath(ParamStr(0)) + 'd:\123.jpg';
  //FileName := 'd:\123.jpg';
  {
  if not FileExists(FileName) then
  begin
    MessageBox(Handle, 'Файл с заданным именем не найден. Действие отменено.',
      'Файл не найден', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end; }
  Fs := TFileStream.Create(FilePachName, fmOpenRead + fmShareDenyWrite);
  try
    SetLength(S, Fs.Size);
    Fs.Read(S[1], Fs.Size);
  finally
    FreeAndNil(Fs);
  end;
 
  result := EncodeString(S);
end;
 
procedure encodeSaveFromBase64(codingFileText, FilePachName:string);
var
  Fs : TFileStream;
  S : AnsiString;
  //FileName : String;
begin
  //FileName := ExtractFilePath(ParamStr(0)) + 'image_out.jpg';
  //FileName := FilePachName;
  Fs := TFileStream.Create(FilePachName, fmCreate);
  S := DecodeString( Trim(codingFileText) );
  try
    Fs.Write(S[1], Length(S));
  finally
    FreeAndNil(Fs);
  end;
end;
ЭТО В СТОРОНУ СЕРВЕРА
На стороне клиента:
Delphi
1
2
3
4
5
6
7
8
9
var
  post:tstringlist;
begin
  post:=TStringList.Create;
  post.Text:=decodeToBase64('d:\device.xml');
  idhttp1.Post('http://127.0.0.1:8011/download',post);
  //idhttp1.Post('http://127.0.0.1:8011/download',decodeToBase64('d:\device.xml'));
  post.Free;
end;
На стороне сервера:
Delphi
1
2
3
4
5
  if (ARequestInfo.Document = '/download')  then
  begin
    encodeSaveFromBase64(ARequestInfo.Params.Text, 'd:\newFile.xml');
 
  end;
ЭТО В СТОРОНУ КЛИЕНТА
На стороне клиента:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
var
  m: TMemoryStream;
begin
  x:=0;
  timer1.Enabled:=true;
  m:= TMemoryStream.Create;
  IdHttp1.Get ('http://127.0.0.1:8011/MyFile', m);
  //IdHttp1.Get ('https://interfax.com.ua/media/thumbs/images/2018/11/6hwNtQOxSkLk.jpg', m);
  m.SaveToFile('1.jpg');
  m.Free;
  timer1.Enabled:=false;
  showmessage(inttostr(x));
end;
На стороне сервера:
Delphi
1
2
3
4
5
6
7
8
9
  if (ARequestInfo.Document = '/MyFile')  then
  begin
    AResponseInfo.ContentType:='image/jpeg';
    AResponseInfo.ContentStream := TFileStream.Create('d:\1123.jpg', fmOpenRead or fmShareCompat);
    //AResponseInfo.ContentStream := TFileStream.Create('d:\123.jpg'(paramstr(0))+ ARequestInfo.Document,fmOpenRead);
    exit; // если в пределах одного приложения и сервер и клиент то виснет намертво БЕЗ exit;
 
    memo1.Lines.Add('Запрос');
  end;
Добавлено через 3 минуты
А можно ли как то отправить файл на сервер без Base64, т.е. например потоком?

Добавлено через 33 минуты
забыл добавить. Ещё это нужно:
Delphi
1
2
uses
  EncdDecd;
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
06.08.2019, 04:59
Цитата Сообщение от Userzx Посмотреть сообщение
Если запущен только сервер и делать запрос браузером то все ОК, но если IDHTTP в этом же приложении что и сервер то всё намертво
Ну и как вы предлагаете это диагностировать? Из вашего пояснения становится понятно, что с сервером все ок, и почему там все намертво - это будет просто гадание на кофейной гуще, которое просто потратит и ваше, и мое время. Попробуйте разнести сервер и клиент по разным приложениям.

Цитата Сообщение от Userzx Посмотреть сообщение
С отправкой файла на сервер разобрался.
Реализация у вас хорошая. Лаконично и действенно. Хорошая работа.

Цитата Сообщение от Userzx Посмотреть сообщение
А можно ли как то отправить файл на сервер без Base64, т.е. например потоком?
Допускаю, что вполне возможно. Не сталкивался лично, конечно, но не вижу причин, почему бы и нет. Просто в post-запросе отправлять не текст, а стрим, и на стороне сервера принимать не ARequestInfo.Params.Text, а ARequestInfo.PostStream
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.08.2019, 04:59
Помогаю со студенческими работами здесь

Обмен файлами
Даны файлы f1,f2,f3,f4,f5 компоненты которых являются вещественными числами. Нужно произвести обмен. f1-f3, f2-f4, f3-f5, f4-f2, f5-f1 ...

Обмен файлами
Если ли вообще написаные программы на дельфи с помощтю которых можно обмениваться файлами, типа я открыл там несколько фильмов, игрушки,...

обмен между файлами
Даны файлы f1 , f2, f3, компоненты которых являются действительными числами. Организовать обмен компонентами между файлами в соответствии...

bluetooth-обмен файлами
Есть 2 ноутбука. Lenovo thinkpad g530 и Lenovo ideapad g 550. Как можно обменяться файлами с помощью блютуз? Устройство находит, а...

Обмен файлами с задержкой
Всем привет. Моя веб-служба должна получать от клиента файлы, обрабатывать их и возвращать клиенту информацию о том, что обработка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru