• 0
Rusland

Через NetHTTPClient передать фотографию на сервер

Вопрос

Вроде видел где-то пример передачи через NetHTTPClient файла (*.png или *.jpg) на сервер, но не могу вспомнить где.

Помогите с кодом отправки файла.

 

PS. Инди компоненты не интересуют, не хочется их инспользовать

Изменено пользователем Rusland

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

7 ответов на этот вопрос

  • 1

В общем рабочее время подходит к концу - поэтому держи:

Function SampleSendFile(Const Url, FileName: String): Boolean;
var
  lHttp: THTTPClient;
  lSendData: TMultipartFormData;
  lResponse: IHTTPResponse;
Begin
  lHttp := THTTPClient.Create;
  lSendData := TMultipartFormData.Create;
  try
    lSendData.AddFile('FileField', FileName);
    lResponse := lHttp.Post(Url, lSendData);
    Result := lResponse.StatusCode = 200;
  finally
    lSendData.Free;
    lHttp.Free;
  end;
End;

 

Rusland понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
31 минуту назад, Сысоев Максим сказал:

В общем рабочее время подходит к концу 

До 17 работаете? Класс :)

За пример большое спасибо... почти также как в IdHTTP)

Изменено пользователем Rusland

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
В 11.07.2016 в 16:52, rareMax сказал:

В общем рабочее время подходит к концу - поэтому держи:


Function SampleSendFile(Const Url, FileName: String): Boolean;
var
  lHttp: THTTPClient;
  lSendData: TMultipartFormData;
  lResponse: IHTTPResponse;
Begin
  lHttp := THTTPClient.Create;
  lSendData := TMultipartFormData.Create;
  try
    lSendData.AddFile('FileField', FileName);
    lResponse := lHttp.Post(Url, lSendData);
    Result := lResponse.StatusCode = 200;
  finally
    lSendData.Free;
    lHttp.Free;
  end;
End;

 

Большое спасибо за пример!

Подскажите, пожалуйста, что делаю не так (я уже 2 дня на загрузку убил, возможно очевидных ошибок не вижу:blink:): не работает код у меня. Серверный скрипт отказывается с ним работать. Выдает ошибку.

Скрипт на стороне сервера (незамысловатый): :unsure:

<?php
$uploaddir = '';
if (move_uploaded_file($_FILES['FileField']['tmp_name'], $uploaddir . $_FILES['FileField']['name'])) {
    print "File is valid, and was successfully uploaded.";
} else {
    print "There some errors!";
}
?>

Через html-форму все отлично грузит (скрипт на сервере рабочий).

Или, пожалуйста, поделитесь скриптиком на php, который дружит с этой функцией. :(

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Сам на свой вопрос и отвечу: при использовании TMultipartFormData, в параметре URL важно точное указание протокола (https или http).

До этого в POST-запросах использовал TStringList. Там значения не имело (работал редирект и запрос отрабатывал)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
В 11 июля 2016 г. в 16:39, Rusland сказал:

Инди компоненты не интересуют, не хочется их инспользовать

А можно узнать почему? Ведь из (с ходу. В 10.2) 3 рабочих tcp серверов работает только idy. В клиентах ситуация не многим лучше. UDP боллемешно обычный работает, но... Короче очень грустно всё остальное.
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
12 часа назад, Akad сказал:

А можно узнать почему?

Из-за проблем с SSL... в маркет не пропускают

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
23 часа назад, Rusland сказал:

Из-за проблем с SSL... в маркет не пропускают

Не совсем верно. При использовании Indy нужно к проекту подключать библиотеки (libcrypto.so, libssl.so) для Android и  (libcrypto.a, libssl.a)iOS. Пример для A есть на форуме. Для iOS такие же телодвижения, библиотеки например здесь

После всего это приложения прекрасно проходят проверки маркетов. Но все это добавляют лишнее телодвижения, размер приложения раздувается. И я бы рекомендовал использовать нативные компоненты, где это возможно. 

Anatoliy, wamaco и Rusland понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: Sashar333
      Здравствуйте! Вопрос такой:
      Есть процедура:
      Если переменные inn,capcha и capchaToken указаны правильно то Idhttp работает как надо, если inn или capcha не верны то прим Idhttp.post программа выдает ошибку:

      а хочется получить данные как в анализаторе:

      Как можно это сделать? 
    • Автор: Anasazi
      Всем доброго времени суток. Возникла необходимость решить такую задачу: в таблице базы MySQL хранится список изображений и их URL. Необходимо получить этот список массивом. Затем загрузить изображения и поочередно с интервалом показать их в TImage.
      Понимаю, что получить список изображений правильнее при помощи PHP скрипта, но в каком виде скрип должен вернуть данные, чтобы в Delphi получить из них массив не знаю.
      Раньше для получения изображений использовал такую процедуру. Но вопрос, где хранить изображения перед демонстрацией их в TImage? Создавать несколько MemoryStream?
      procedure LoadWebImage(url: string; image: TBitmap);
      var
        idhttp : TNetHTTPClient;
        ms : TMemoryStream;
      begin
       IdHTTP := TNetHTTPClient.Create(nil);
        ms := TMemoryStream.Create;
        try
          idhttp.Get(url, ms);
          ms.Position := 0;
          image.LoadFromStream(ms);
        finally
          ms.Free;
          idhttp.Free;
        end;
      end;
    • Автор: Rusland
      Как реализовать показ ProgressBar при загрузке фотографии на сервер? Интересует как именно определять сколько байт передано?
      Используется компонент NetHTTPClient.
    • Автор: Rusland
      На NetHTTPClient пытаюсь назначить обработчик OnValidateServerCertificate:
       
      type TFrmMain = class(TForm) ... procedure OnAuthEvent(const Sender: TObject; AnAuthTarget: TAuthTargetType; const ARealm, AURL: string; var AUserName, APassword: string; var AbortAuth: Boolean; var Persistence: TAuthPersistenceType); procedure OnValidateServerCertificate(const Sender: TObject; const ARequest: TURLRequest; const [Ref] Certificate: TCertificate; var Accepted: Boolean); function TFrmMain.GetResponse2(aURL: string): TResponser; var Ss: TStringStream; NetHTTPClient2:TNetHTTPClient; Respon: IHTTPResponse; begin try NetHTTPClient2:=TNetHTTPClient.Create(nil); NetHTTPClient2.OnAuthEvent:=OnAuthEvent; NetHTTPClient2.OnValidateServerCertificate:=OnValidateServerCertificat; // ошибка компиляции ... with NetHTTPClient2 do begin Ss:=TStringStream.Create('', TEncoding.UTF8); Respon:=Get(aURL,ss); end; finally NetHTTPClient2.Free; end; end; procedure TFrmMain.OnValidateServerCertificate( const Sender: TObject; const ARequest: TURLRequest; const [Ref] Certificate: TCertificate; var Accepted: Boolean); begin Accepted:=true; end; Получаю ошибку: Incompatible types: 'Parameter lists differ'  
      Как правильно сделать?
    • Автор: Rusland
      Так как не получается работать с IdHTTP в сервисе, решил попробовать компонент NetHTTPClient. Бросил NetHTTPClient1 на форму.
      Хочу открыть адрес https://ya.ru
      В папку \Win32\Debug положил libeay32.dll и ssleay32.dll (они рабочие, проверены с IdHTTP)
       
      Код (пока тестирую на обычном приложении, а не в сервисе):
      Получаю access violation в System.Net.HTTPClient в строке 1965 
      if (Result.Value.Chars[0] = '"') and (Result.Value[High(Result.Value)] = '"') then видимо из-за того что Result.Value пустой. 
      А если попробовать открыть https://mail.ru такого не происходит и страница нормально скачивается.
       
      В чем проблема?
    • Автор: Ethernet
      Доброго вам времени суток, уважаемые форумчане.
      Столкнулся с проблемой нажатия на кнопку сайта.

      Инструментарий:
      Delphi XE7 --> FM;
      Indy 10.6.0.5169 --> idHTTP
       
      Свойства idHTTP1:
      CookieManager  | IdCookieManager1
      AllowCookies      | True
      HandleRedirects | True
       
      Процедура в разрабатываемом приложении:
      procedure SelenaURL.SendData(Captcha: string); var i: Integer; Text: String; begin try Params := TStringList.Create; Params.Add('title=' + fMain.eTitle.Text); Params.Add('cat_id=121'); case fMain.cbCategory.ItemIndex of 0: Params.Add('pred=1'); 1: Params.Add('pred=2'); end; Params.Add('price=' + fMain.eCost.Text); Params.Add('currency=1'); case fMain.cbCity.ItemIndex of 0: Params.Add('city_id=1'); 1: Params.Add('city_id=2'); 2: Params.Add('city_id=3'); 3: Params.Add('city_id=4'); 4: Params.Add('city_id=5'); end; Text := fMain.mText.Lines[0]; for i := 1 to fMain.mText.Lines.Count - 1 do Text := Text + #13#10 + fMain.mText.Lines[i]; Params.Add('description=' + Text); Params.Add('name_from=' + fMain.eName.Text); Params.Add('email_from=' + fMain.eMail.Text); Params.Add('phone_from=' + fMain.ePhone.Text); for i := 1 to fMain.ListBox2.Count do Params.Add('photo_' + IntToStr(i) + '=' + fMain.ListBox2.Items[i - 1]); Params.Add('period=30'); Params.Add('captcha=' + Captcha); Params.Add('submit=Добавить объявление'); // Что с ним, что без него запрос не уходит Response := fMain.IdHTTP1.Post(aURL, Params); fMain.mText.Lines.Clear; fMain.mText.Text := Response; // Тут можно увидеть, что переадресации никакой не было. Где стояли, там и стоим finally Params.Free; end; end; Код самой кнопки:
      <input class="buttom" onclick="addForm(document.getElementById('f'))" value="Добавить объявление" type="submit"> Код процедуры, выполняемая кнопкой:
      /* Подгружаем форму - добавить объявление */ function addForm(value) { form_result = document.getElementById('ajax_result'); form_indicator = document.getElementById('ajax_indicator'); form_result.className = 'ajaxform-result-hide'; form_indicator.innerHTML = '<img src="'+AJAX_DIR+'templates/default/images/indicator.gif">'; form_indicator.className = 'ajaxform-indicator'; JsHttpRequest.query( AJAX_DIR+'ajax.php?act=add', { q: value }, function(result, errors) { form_result.innerHTML = ''; if (result['q']) { form_result.innerHTML = '<div class="ajaxform-result"><fieldset class="fieldset_error"><legend class="legend_error">Ошибка:</legend>'+result['q']+'</fieldset></div>'; form_result.className = ''; form_indicator.innerHTML = ''; document.getElementById("ajax_form").style.display = 'block'; }else{ if(result['action'] == '3') { form_result.innerHTML = '<div class="ajaxform-result"><fieldset class="fieldset_msg"><legend class="legend_msg">Сообщение:</legend><div class="msg">Ваше объявление было отправлено на проверку. <a href="'+AJAX_DIR+'">Перейти на главную страницу</a>.<br><br>Ваши данные: <br><b>ID:</b> '+result['id']+' <br><b>Пароль:</b> '+result['password']+'</div></fieldset>'; }else{ form_result.innerHTML = '<div class="ajaxform-result"><fieldset class="fieldset_msg"><legend class="legend_msg">Сообщение:</legend><div class="msg">Ваше объявление "<b>ID'+result['id']+'</b>" было успешно добавлено. <a href="'+AJAX_DIR+''+result['id']+'.html">Перейти к объявлению</a>.<br><br>Ваши данные: <br><b>ID:</b> '+result['id']+' <br><b>Пароль:</b> '+result['password']+'</div></fieldset>'; } form_result.className = ''; form_indicator.innerHTML = ''; document.getElementById("ajax_form").style.display = 'none'; } }, false // не кэшировать ); } /* конец */ Наведите хотя бы в какую сторону копать. Срочно необходимо завершить приложение, но возникла данная проблема.
      Буду рад любой вашей помощи. Спасибо!
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу