Перейти к содержанию
  • Регистрация
  • 0
Rusland

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

Вопрос

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

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

 

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

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

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


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

Рекомендуемые сообщения

  • 2

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

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;

 

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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 такие же телодвижения, библиотеки например здесь

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

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От Mars M
      Есть такой вот код для работы с гугл переводчиком:
      procedure TfrmMain.GTranslate; var Data: TStringList; S: String; begin IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU) Gecko/20100625 Firefox/3.6.6'; Data := TStringList.Create; try Data.Text := ('client=x'#13#10 + 'text=' + Edit1.Text + #13#10 + 'hl=en'#13#10 + 'sl=en'#13#10 + 'tl=ru'); try S := (IdHTTP1.Post('http://translate.google.ru/translate_a/t', Data)); except on E: exception do ShowMessage(E.ClassName + ' error raised, with message : ' + E.Message); end; finally Data.Free; end; end; Работает без проблем.
      Переделал его для NetHttpClient, практически один в один и вместо перевода получаю html страницу с гугл капчей.
      Типа такой как получаю если заходить через браузер http://translate.google.ru/translate_a/t?client=x&text=Hello&hl=en&sl=en&tl=ru
      Так в чем между ними разница что получаю разный результат?
      PS: Просто я в проекте и так использую NetHttpClient, хотелось бы на нем и сделать а не плодить кучу однотипных компонентов.
    • От 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 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...