Перейти к публикации
Lada-forum.ru
Mobile™

есть тут программисты?

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

Что конкретно вас интересует?

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

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="'+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;

вчера целый день засовывал ее на форму а сегодня все утро приделывал что бы файл кнопкой загружался и хост в edit1 записать можно было. а вот с прогрессбаром чувствую сам не справлюсь.

исходники-

http://webfile.ru/4012376

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


Ссылка на сообщение
Поделиться на других сайтах
видимо вы ничем помочь не можете?

это тебе надо на форум програмистов

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


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

if len > 0 then // если есть чтото

begin

result := result + copy(buf, 0, len);

// сюда добавить

end

Перед end добавить это:

Form1.ProgressBar1.Position:= len * 100 / fs; // прогресс в %

вместо переменной len возможно надо подставить какую то другую, Делфи под рукой нет, проверить не могу.

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


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

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

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

Гость
Ответить в тему...

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

  Разрешено не более 75 эмодзи.

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

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

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

Загрузка...

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