Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.01.2012, 19:48
Аватар для RusMaXXX
RusMaXXX RusMaXXX вне форума
Начинающий
 
Регистрация: 01.10.2008
Сообщения: 138
Версия Delphi: 7
Репутация: 21
Восклицание кодировка в idHTTP

всем доброго времени суток! такой вопрос, почему при отправке файла на сервер при этом если имя файла имеет кириллицу, то на серваке файл есть, а имени не имеет? но если имя отправляемого файла латиница, либо цифры, то на сервере все норм с именем!!

вот код отправки:

Код:
function Send_File(FileName: string): string;
var
  link, Response: String;
  FormData: TIdMultiPartFormDataStream;
  S, E: integer;
begin
  FormData := TIdMultiPartFormDataStream.Create;
  try
    MainForm.IdHTTP.HandleRedirects := True;
    MainForm.IdHTTP.Request.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10';
    MainForm.IdHTTP.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
    MainForm.IdHTTP.Request.AcceptLanguage:='ru,en-us;q=0.7,en;q=0.3';
    MainForm.IdHTTP.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.7';

    FormData.AddFile('upfile', FileName, 'image/jpeg');
    FormData.AddFormField('password', MainForm.ed_pass.text);
    FormData.AddFormField('keep-days', IntToStr(MainForm.kol_day.Position));

    Response := MainForm.idHTTP.Post('http://share.bashtel.ru/upload', FormData);

    S := pos('value=', Response) + Length('value=');;
    E := pos('/></span><br/', Response);
    Result := Copy (Response, S+1, (E - S - 1)-2);
  finally
    FormData.Free;
  end;
end;

файл загружается на сервер норм, но че может быть с именем!??

все это написано на Delphi 7 инди стандартная, т.е. которая идет сразу с Д7
__________________
уволен в запас!!!
Ответить с цитированием
  #2  
Старый 19.01.2012, 19:56
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

сервер хочет utf-8 кодировку.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 19.01.2012, 19:59
Аватар для RusMaXXX
RusMaXXX RusMaXXX вне форума
Начинающий
 
Регистрация: 01.10.2008
Сообщения: 138
Версия Delphi: 7
Репутация: 21
По умолчанию

Цитата:
Сообщение от NumLock
сервер хочет utf-8 кодировку.

как именно ему передать имя файла в кодировке UTF-8?? если бонально воспользоваться функцией AnsiToUTF8, то потом выходит ошибка мол нет файла для отправки!!! если можно, то примерчик
__________________
уволен в запас!!!
Ответить с цитированием
  #4  
Старый 20.01.2012, 10:03
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

либо отказаться от Инди, либо доработать ее:

Код:
function TIdMultiPartFormDataStream.FormatField(AIndex: Integer): string;
  function FileField(AItem: TIdFormDataField): string;
  begin
    with AItem do begin
      result := Format('--' + Boundary + crlf + sContentDisposition +
        sFileNamePlaceHolder + crlf +
        sContentTypePlaceHolder, [FieldName, UTF8Encode(ExtractFileName(FileName)), ContentType]);
    end;
  end;

  function NormalField(AItem: TIdFormDataField): string;
  begin
    with AItem do begin
      result := Format('--' + Boundary + crlf + sContentDisposition + crlf + crlf +
        FieldValue + crlf, [FieldName]);
    end;
  end;

begin

+function TIdFormDataField.GetFieldSize: LongInt;

но лучше сделать все-таки универсальной, чтобы имя ресурса можно было передавать через AddFile.
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 20.01.2012 в 10:05.
Ответить с цитированием
  #5  
Старый 24.01.2012, 13:18
Аватар для RusMaXXX
RusMaXXX RusMaXXX вне форума
Начинающий
 
Регистрация: 01.10.2008
Сообщения: 138
Версия Delphi: 7
Репутация: 21
По умолчанию

нашел решение своей проблемы этим способом:

Код:
uses winsock;

function SendFile(host, script, filename:string):string;
var
  sock : dword;
  ca : sockaddr_in;
  HTTPHeader : string;
  boundary : string;
  fs:dword;
  hFile : DWORD;
  buf : array [0..4095] of char;
  p : PHostEnt;
  rb : cardinal;
  len : integer;
  SubHeader1 : string;
  SubHeader2 : string;
begin
  result := '';
  // открываем файл на чтение
  hFile := CreateFile(PChar(filename), GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

  if hFile <> INVALID_HANDLE_VALUE then // если всё норм
  begin
    fs := GetFileSize(hFile, nil); // получим размер файла
    // создаем сокет
    sock := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    // если создался сокет
    if sock <> INVALID_SOCKET then // если норм
    begin
      ca.sin_family := AF_INET;
      ca.sin_port := htons(80); // порт 

      p := GetHostByName(PChar(host)); // получим ip по домену
      if p = nil then // если нету
      begin
        // значит это IP
        ca.sin_addr.s_addr := inet_addr(pchar(host));
      end
      else
      begin
        // выдерим ip
        ca.sin_addr := PInAddr(p.h_addr_list^)^;
      end;

      // коннектимся
      if connect(sock, ca, sizeof(ca)) <> -1 then
      begin
        // если всё норм
        // генерим разделитель
        boundary := inttohex(random(65535), 4)+inttohex(random(65535), 4)+inttohex(random(65535), 4);
          // создаем части HTTP заголовка
        SubHeader1 :=  '--'+boundary+#13#10+
                      'Content-Disposition: form-data; name="myfile"; filename="'+AnsiToUTF8(FileName)+'"'#13#10+
                      'Content-Type: application/octet-stream'#13#10#13#10;
        SubHeader2 := #13#10+'--'+boundary+'--'#13#10;
        HTTPHeader := 'POST '+script+' HTTP/1.1'#13#10+
                      'Host: '+host+#13#10+
                      'Connection: close'#13#10+
                      'Content-Type: multipart/form-data; boundary='+boundary+#13#10+
                      'Content-Length: '+inttostr(fs + length(SubHeader1) + length(SubHeader2))+#13#10#13#10+SubHeader1;

         // посылаем заголовок
        send(sock, HTTPHeader[1], length(HTTPHeader), 0);
        while true do
        begin
          rb := 0;
          // читаем 4 кила из файла
          ReadFile(hFile, buf, 4096, rb, nil);
          if rb = 0 then break; // если не считалось то выход из цикла
          send(sock, buf, rb, 0); // пошлем считанные данные
        end;
          // пошел последний разделитель
        send(sock, SubHeader2[1], length(SubHeader2), 0);
        while true do // к цикле ждем ответа от сервера
        begin
          len := recv(sock, buf, 4096, 0); // считали данные
          if len > 0 then // если есть чтото
          begin
            result := result + copy(buf, 0, len);
          end
          else
          begin // если нет больше данных то выходим из цикла
            break;
          end;
        end;
      end;
      closesocket(sock); // закрываем сокет
    end;
    CloseHandle(hFile); // закрываем файл
  end;
end;

применяется так:
Код:
var
  ws : TWSAData;
  s : string;
begin
  WSAStartup($101, ws);
  s := SendFile('localhost', '/1.php', 'c:\test.txt');
  ShowMessage(s);
end;

но теперь др проблема, как добавить в пост запрос, доп параметры, т.е. файл для отправки на сервер есть, нужны параметры отправить к примеру параметры разрешения(размеры) картинки???
__________________
уволен в запас!!!
Ответить с цитированием
  #6  
Старый 24.01.2012, 16:08
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
    Result:=Format(
      '--%s'+CR+'Content-Disposition: form-data; name="%s"'+CR+CR+'%s'+CR,
      [FBoundary, FFieldName, FFieldValue]
    );
естественно, что его размер нужно добавить к Content-Length
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:05.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter