|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
кодировка в 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
|
||||
|
||||
сервер хочет utf-8 кодировку.
Пишу программы за еду. __________________ |
#3
|
||||
|
||||
Цитата:
как именно ему передать имя файла в кодировке UTF-8?? если бонально воспользоваться функцией AnsiToUTF8, то потом выходит ошибка мол нет файла для отправки!!! если можно, то примерчик уволен в запас!!! |
#4
|
||||
|
||||
либо отказаться от Инди, либо доработать ее:
Код:
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
|
||||
|
||||
нашел решение своей проблемы этим способом:
Код:
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
|
||||
|
||||
Код:
Result:=Format( '--%s'+CR+'Content-Disposition: form-data; name="%s"'+CR+CR+'%s'+CR, [FBoundary, FFieldName, FFieldValue] ); Пишу программы за еду. __________________ |