Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2014, 23:09   #1
Зод
Форумчанин
 
Регистрация: 25.08.2011
Сообщений: 140
По умолчанию Отправка файла на сервер

Цель: загрузить файл на сайт.
Есть код на синапсе:
Код:
procedure TForm1.Otpravka(Sender: TObject);
Const
  CRLF = #$0a + #$0d;
  CR = #$0a;
var
  HTTP: THTTPSend;
  s: AnsiString;
  FS: TFileStream;
begin
     HTTP := THTTPSend.Create;
     HTTP.Protocol:='1.1';
     HTTP.Headers.Add('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
     HTTP.Headers.Add('Accept-Language: en-us,en;q=0.5');
     HTTP.Headers.Add('Accept-Encoding: gzip, deflate');
     FS:=TFileStream.Create('8.jpg', fmOpenRead);
      HTTP.MimeType := 'multipart/form-data; boundary=---------------------------296832204222114';
      s := '-----------------------------296832204222114' + CR +
        'Content-Disposition: form-data; name="files[]"; filename="8.JPEG"'
        + CR + 'Content-Type: image/jpeg' + CRLF;
      HTTP.Document.Write(PAnsiChar(s)^, Length(s));
      FS.Position := 0;
      HTTP.Document.CopyFrom(FS, FS.Size);
    s := CR + '-----------------------------296832204222114' + CR + 'Content-Disposition: form-data; name="user-form"' +
     CRLF + 'Send request' + CR + '-----------------------------296832204222114--';
    HTTP.Document.Write(PAnsiChar(s)^, Length(s));
     HTTP.HTTPMethod('POST', 'https://урл');
     FS.Free;
  end;
И он определенно не работает. Сервер не принимает картинку. Но если сделать так:
Код:
begin
     HTTP := THTTPSend.Create;
     HTTP.Protocol:='1.1';
     HTTP.Headers.Add('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
     HTTP.Headers.Add('Accept-Language: en-us,en;q=0.5');
     HTTP.Headers.Add('Accept-Encoding: gzip, deflate');
     FS:=TFileStream.Create('8.jpg', fmOpenRead);
      HTTP.MimeType := 'multipart/form-data; boundary=---------------------------296832204222114';
      HTTP.Document.Write(PAnsiChar(s)^, Length(s));
      FS.Position := 0;
      HTTP.Document.CopyFrom(FS, FS.Size);
    HTTP.Document.Write(PAnsiChar(s)^, Length(s));
     HTTP.HTTPMethod('POST', 'https://урл);
     FS.Free;
  end;
а вместо картинке создать текстовый файл с именем 8.jpg и запихнуть в него нужные строки
Код:
-----------------------------296832204222114
Content-Disposition: form-data; name="files[]"; filename="029.JPG"
Content-Type: image/jpeg

файл картинке открытой блокнотом и скопированной сюда
-----------------------------296832204222114
Content-Disposition: form-data; name="user-form"

Send request
-----------------------------296832204222114--
То "картинка" загрузится успешно, сервер ее примет.
В чем может быть проблема?
Я конечно понимаю что я в Делфи не правильно создаю запрос, но он точно такой же как в 2 варианте, а результат отправки разный.
Кто поможет?

Последний раз редактировалось Зод; 02.10.2014 в 23:38.
Зод вне форума Ответить с цитированием
Старый 02.10.2014, 23:14   #2
indexx
Заблокирован
 
Регистрация: 12.09.2014
Сообщений: 544
По умолчанию

Перехвати пакет и посмотри что с ним не так.
indexx вне форума Ответить с цитированием
Старый 02.10.2014, 23:30   #3
Зод
Форумчанин
 
Регистрация: 25.08.2011
Сообщений: 140
По умолчанию

Отправка один в один во всех вариантах. Сервер в первом случае ругается так :
The file "1.JPEG" cannot be uploaded. Only files of these MIME-types are allowed: image/gif, image/jpeg, image/pjpeg, image/png, application/pdf
Как понимаю здесь два варианта. Либо я записывая тело отправки нарушаю структуру файла (на взгляд различий не вижу), либо не правильно выставляю bound ( на взгляд опять же все строчка в строчку).


В принципе проблему решает замена
Код:
Const
  CRLF = #$0a + #$0d;
  CR = #$0a;
на
Код:
Const
  CRLF = #13#10;
  CR = #13#10;

Последний раз редактировалось Зод; 03.10.2014 в 10:37.
Зод вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка файла на HTTP сервер POST запросом на WinSock Vladimirok Работа с сетью в Delphi 2 14.04.2012 06:26
Поиск файла в подкаталогах и отправка на сервер Ёжик в тумане Общие вопросы Delphi 1 20.07.2011 11:17
Отправка файла на FTP сервер через прокси Игорь С Microsoft Office Access 0 21.07.2010 12:57
Отправка файла на сервер kirill555 PHP 8 21.12.2007 12:51