Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: Сети
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
саша40
-11 / 289 / 47
Регистрация: 14.08.2012
Сообщений: 2,533
#1

Запись файла на сервер(не фтп!)

30.05.2013, 08:56. Просмотров 1606. Ответов 20
Метки нет (Все метки)

Привет. Написал вот такую функцию:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function WriteFileServer(Url,FileName: String): Boolean; stdcall;
const BufferSize=1024; //память размером 1 килобайт
var
hSesion,hurl: HInternet; //пиременые сеанса связи
Buffer: array [1..BufferSize] of Byte; //массив байтов
BufferLen: DWORD; //длина
f: file; //сам файл(любой)
sAppName: String; //имя файла
begin
Result:=false;
sAppName:=ExtractFileName(FileName); //получаем имя файла
hSesion:=InternetOpen(PChar(FileName), INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0); //открываем сесию
try
hUrl:=InternetOpenURL(HSesion,PChar(Url),nil,0,0,0);    //соеденяемся по Url
try
AssignFile(f,sAppName); //открываем файл у себя на компьютере
Rewrite(f); 
try
BlockRead(f,Buffer,BufferSize); //читаем блок в массив байтов
repeat
InternetWriteFile(hUrl,@Buffer,sizeof(Buffer),BufferLen); //загружаем до тех пор, пока буфер длины не будет равен 0
until
BufferLen=0;
finally
CloseFile(f); //финали указало на конец файла, закрываем файл
Result:=true; //всё прошло удачно
end;
finally
InternetCloseHandle(hUrl); //закрываем хендл url
end;
finally
IntrnetCloseHandle(hSesion); //закрываем сесию
end;
end;
Смысл в том, чтобы загрузить файл по Url. Например, пользователь дал такое url: http://www.mysite.ru/files/. Мы значит его открываем и туда грузим. Вопрос: Правильно всё ли?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2013, 08:56
Ответы с готовыми решениями:

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

Скорость передачи файла на фтп
Добрый день! Подскажите, как реализовать чтоб показывало скорость отдачи файла...

Запись данных в OPC сервер
Доброго времени суток, форумчане. Передо мной стоит проблема: есть OPC сервер,...

Загрузка файла на удаленный сервер по фтп
Не могу найти ответ на достаточно элементарный вопрос. Есть два хостинг...

фтп-сервер
есть роутер и вайфай дома. к роутеру витой парой подкоючен пк с 3тб пзу. так...

20
mss
2631 / 2256 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
30.05.2013, 09:11 #2
Неправильно.
0
саша40
-11 / 289 / 47
Регистрация: 14.08.2012
Сообщений: 2,533
30.05.2013, 09:51  [ТС] #3
Цитата Сообщение от mss Посмотреть сообщение
Неправильно.
да в конце перепутал, надо было написать:
Delphi
1
InternetCloseHandle(hSesion);
Ещё ошибки есть? Укажи их мне
0
mss
2631 / 2256 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
30.05.2013, 11:11 #4
Цитата Сообщение от саша40 Посмотреть сообщение
Укажи их мне
Любуйся:

Rewrite(f); // !! с какого перепугу рерайт-то ? Ты что, локальный файл перезаписываешь ? Ты его ЧИТАЕШЬ, а записан он будет на удаленном хосте !!
try
BlockRead(f,Buffer,BufferSize); //читаем блок в массив байтов // !!! И сколько таких блоков в файле ? Один что ли ?
repeat
InternetWriteFile(hUrl,@Buffer,sizeof(Buffer),BufferLen); //загружаем до тех пор, пока буфер длины не будет равен 0
until
BufferLen=0; // и когда же, по-твоему, будет выполнено это условие ?

Отладчиком когда соизволишь воспользоваться для устранения собственных косяков ?
0
саша40
-11 / 289 / 47
Регистрация: 14.08.2012
Сообщений: 2,533
30.05.2013, 11:35  [ТС] #5
Цитата Сообщение от mss Посмотреть сообщение
Любуйся:

Rewrite(f); // !! с какого перепугу рерайт-то ? Ты что, локальный файл перезаписываешь ? Ты его ЧИТАЕШЬ, а записан он будет на удаленном хосте !!
try
BlockRead(f,Buffer,BufferSize); //читаем блок в массив байтов // !!! И сколько таких блоков в файле ? Один что ли ?
repeat
InternetWriteFile(hUrl,@Buffer,sizeof(Buffer),BufferLen); //загружаем до тех пор, пока буфер длины не будет равен 0
until
BufferLen=0; // и когда же, по-твоему, будет выполнено это условие ?

Отладчиком когда соизволишь воспользоваться для устранения собственных косяков ?
ну на счет rewrite и reset- это нечего, подправлю. А на счет чтения, это то, что try finally я при чтение не случайно поставил. финали как раз и укажет на конец файла. Так что, mss, пиар не удался!
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25738 / 17292 / 6875
Регистрация: 22.10.2011
Сообщений: 30,518
Записей в блоге: 6
30.05.2013, 12:50 #6
саша40, мозги включи.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
hUrl:=InternetOpenURL(HSesion,PChar(Url),nil,0,0,0);    //соеденяемся по Url
try
  AssignFile(f,sAppName); //открываем файл у себя на компьютере
  Rewrite(f); // который Reset
  try
    BlockRead(f,Buffer,BufferSize); // читаем... Прочитал. 1024 байта. А размер файла - 1026. 2 байта уже потерял
    repeat
      InternetWriteFile(hUrl,@Buffer,sizeof(Buffer),BufferLen); 
      // Записал 1024 байта. BufferLen = 1024. Не, надо еще раз записать? Опять 1024... Что ж такое???
    until BufferLen=0;
  finally
    CloseFile(f); // <--- Как попал сюда?
    Result:=true; //всё прошло удачно
  end;
finally
  InternetCloseHandle(hUrl); //закрываем хендл url
end;
0
mss
2631 / 2256 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
30.05.2013, 12:56 #7
Цитата Сообщение от саша40 Посмотреть сообщение
финали как раз и укажет на конец файла
Бредятина.
0
саша40
-11 / 289 / 47
Регистрация: 14.08.2012
Сообщений: 2,533
30.05.2013, 14:15  [ТС] #8
Цитата Сообщение от UI Посмотреть сообщение
саша40, мозги включи.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
hUrl:=InternetOpenURL(HSesion,PChar(Url),nil,0,0,0);    //соеденяемся по Url
try
  AssignFile(f,sAppName); //открываем файл у себя на компьютере
  Rewrite(f); // который Reset
  try
    BlockRead(f,Buffer,BufferSize); // читаем... Прочитал. 1024 байта. А размер файла - 1026. 2 байта уже потерял
    repeat
      InternetWriteFile(hUrl,@Buffer,sizeof(Buffer),BufferLen); 
      // Записал 1024 файла. BufferLen = 1024. Не, надо еще раз записать? Опять 1024... Что ж такое???
    until BufferLen=0;
  finally
    CloseFile(f); // <--- Как попал сюда?
    Result:=true; //всё прошло удачно
  end;
finally
  InternetCloseHandle(hUrl); //закрываем хендл url
end;
Мда.. Мне что по 1 байту туда записывать?
0
mss
2631 / 2256 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
30.05.2013, 15:00 #9
Цитата Сообщение от саша40 Посмотреть сообщение
Мне что по 1 байту туда записывать?
Хоть по одному хоть по стопиццот.
Но в цикле должно быть чтение, пока не прочитаны все байты из передаваемого файла, вплоть до проследнего !

А ты влупил чтение вне цикла и сидишь ждешь у моря погоды.
0
саша40
-11 / 289 / 47
Регистрация: 14.08.2012
Сообщений: 2,533
30.05.2013, 18:12  [ТС] #10
Цитата Сообщение от UI Посмотреть сообщение
саша40, мозги включи.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
hUrl:=InternetOpenURL(HSesion,PChar(Url),nil,0,0,0);    //соеденяемся по Url
try
  AssignFile(f,sAppName); //открываем файл у себя на компьютере
  Rewrite(f); // который Reset
  try
    BlockRead(f,Buffer,BufferSize); // читаем... Прочитал. 1024 байта. А размер файла - 1026. 2 байта уже потерял
    repeat
      InternetWriteFile(hUrl,@Buffer,sizeof(Buffer),BufferLen); 
      // Записал 1024 байта. BufferLen = 1024. Не, надо еще раз записать? Опять 1024... Что ж такое???
    until BufferLen=0;
  finally
    CloseFile(f); // <--- Как попал сюда?
    Result:=true; //всё прошло удачно
  end;
finally
  InternetCloseHandle(hUrl); //закрываем хендл url
end;
Может дествительно передавать по 1 килобайту, но читать по 1 байту(записывать в массив байтов цыклом 1024 байта инфы) и отправлять?

Добавлено через 3 минуты
Цитата Сообщение от саша40 Посмотреть сообщение
Может дествительно передавать по 1 килобайту, но читать по 1 байту(записывать в массив байтов цыклом 1024 байта инфы) и отправлять?
Добавлю, что узнаю количество килобайт и количество неполных килобайт(оставшихся байт).
0
mss
2631 / 2256 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
30.05.2013, 19:17 #11
Цитата Сообщение от саша40 Посмотреть сообщение
Может дествительно передавать по 1 килобайту, но читать по 1 байту
Глупейшая идея.

Цитата Сообщение от саша40 Посмотреть сообщение
узнаю количество килобайт и количество неполных килобайт
А их и узнавать нет никакой надобности.
Достаточно проштудировать документацию, в которой сказано, что 4-й параметр BrockRead() предназначен для возврата актуально прочитанного числа байт из запрошенных в третьем параметре.
Но ты упорно не желаешь ее читать, предпочитая вместо этого раздавать идиотские советы.


Цитата Сообщение от саша40 Посмотреть сообщение
цыклом
До коих же пор ты будешь бессовестно мордовать русский язык, в котором всего лишь в ТРЕХ словах допускается слог ЦЫ

ЦЫган, ЦЫпленок, ЦЫпочки

?)
0
саша40
-11 / 289 / 47
Регистрация: 14.08.2012
Сообщений: 2,533
31.05.2013, 12:01  [ТС] #12
Цитата Сообщение от mss Посмотреть сообщение
Глупейшая идея.



А их и узнавать нет никакой надобности.
Достаточно проштудировать документацию, в которой сказано, что 4-й параметр BrockRead() предназначен для возврата актуально прочитанного числа байт из запрошенных в третьем параметре.
Но ты упорно не желаешь ее читать, предпочитая вместо этого раздавать идиотские советы.




До коих же пор ты будешь бессовестно мордовать русский язык, в котором всего лишь в ТРЕХ словах допускается слог ЦЫ

ЦЫган, ЦЫпленок, ЦЫпочки

?)
Может тогда ещё код напишешь, а то интересно.
0
chizz
983 / 501 / 101
Регистрация: 19.03.2013
Сообщений: 3,104
Записей в блоге: 19
Завершенные тесты: 1
31.05.2013, 12:07 #13
Цитата Сообщение от саша40 Посмотреть сообщение
Мы значит его открываем и туда грузим. Вопрос: Правильно всё ли?
У меня такое чувство, что вы программы свои пишете в блокноте. Либо CTRL-C CTRL-V чужой код и спрашиваете - а работает правильно?

Запусти, да посмотри.
0
mss
2631 / 2256 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
31.05.2013, 12:38 #14
Цитата Сообщение от саша40 Посмотреть сообщение
а то интересно
Ага.
Я буду тебя развлекать кодом, а ты будешь сидеть в носу ковыряя.

Код нужно писать самомтоятельно - с чувством, с толком, с расстановкой, с внимательным штудированием документации и непременным использованием отладчика.
0
саша40
-11 / 289 / 47
Регистрация: 14.08.2012
Сообщений: 2,533
31.05.2013, 15:10  [ТС] #15
Цитата Сообщение от mss Посмотреть сообщение
Ага.
Я буду тебя развлекать кодом, а ты будешь сидеть в носу ковыряя.

Код нужно писать самомтоятельно - с чувством, с толком, с расстановкой, с внимательным штудированием документации и непременным использованием отладчика.
ТЫ ГОВОРИШЬ БОЛЬШЕ ЧЕМ ДЕЛАЕШЬ!
Я уже примерно придумал как грузить файлы:
1) Определяем размер файла
2) Устанавливаем кол-во "пакетиков" по 1024 байт, короче узнаем кол-во килобайт.
3) Отнимаем это кол-во(1024*кол-во пакетов) от размера файла
4) Если при вычитание получилось больше 0, но меньше 1024(а это получится, если больше 0), то формируем пакет остаточных байтов.

Вот код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
GetFileSize(FileName: String): Integer;
Var
 InfoFile : TSearchRec;
 AttrFile : Integer;
 ErrorReturn : Integer;
 Begin
 AttrFile := $0000003F;
 ErrorReturn := FindFirst(filename,AttrFile,InfoFile);
 if ErrorReturn <> 0 Then Result := -1
 else Result := InfoFile.Size;
 FindClose(InfoFile);
end;
 
 
function WriteFileServer(Url, FileName: String): Boolean;
var
hSesion,hurl: HInternet;
Buffer: array [1..1024] of Byte; //массив байтов
BufferLen: DWORD;
FileLen: Integer; //размер файла
n: integer; //кол-во пакетов размером в 1024 байта
h: integer; //кол-во оставшихся байт
i: integer;
f: file;
sAppName: String;
begin
Result:=false;
sAppName:=ExtractFileName(FileName);
FileLen:=GetFileSize(FileName); //узнаем размер файла
n:=FileLen div 1024; //узнаем частное от деления, короче кол-во полных пакетов
h:=FileLen mod 1024; //узнаем остаток байт
hSesion:=InternetOpen(PChar(FileName), INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0); 
try
hUrl:=InternetOpenURL(HSesion,PChar(Url),nil,0,0,0);  
try
AssignFile(f,sAppName);
Reset(f);
 
if n>0 then //если файл 1024 или больше байт
begin
 
for i:=1 To n Do
begin
BlockRead(f,Buffer,1024);
repeat
InternetWriteFile(hUrl,@Buffer,sizeof(Buffer),BufferLen);
until
BufferLen=0;
end; //пока не всё
end;
 
if h>0 then //есть ли остаток?
begin
BlockRead(f,Buffer,h);
repeat
InternetWriteFile(hUrl,@Buffer,sizeof(Buffer),BufferLen);
until
BufferLen=0;
 
end;
//вот теперь готово
CloseFile(f);
Result:=true;
finally
InternetCloseHandle(hUrl);
end;
finally
InternetCloseHandle(hSesion);
end;
Добавлено через 1 минуту
mss, надеюсь теперь с расстановкой. Ты в мне вдохновение пробрел. Спасибо!
0
chizz
31.05.2013, 15:13
  #16

Не по теме:

велосипедист)

0
саша40
-11 / 289 / 47
Регистрация: 14.08.2012
Сообщений: 2,533
31.05.2013, 15:16  [ТС] #17
Цитата Сообщение от chizz Посмотреть сообщение

Не по теме:

велосипедист)

Не по теме:

в каком смысле? Код вроде верный O_o

0
chizz
983 / 501 / 101
Регистрация: 19.03.2013
Сообщений: 3,104
Записей в блоге: 19
Завершенные тесты: 1
31.05.2013, 15:36 #18
Цитата Сообщение от саша40 Посмотреть сообщение
Код вроде верный
Может и верный, но это...

Цитата Сообщение от саша40 Посмотреть сообщение
FileLen:=GetFileSize(FileName); //узнаем размер файла
n:=FileLen div 1024; //узнаем частное от деления, короче кол-во полных пакетов
h:=FileLen mod 1024; //узнаем остаток байт
Какие-то непонятные квадратные колеса.

Добавлено через 4 минуты
Delphi
1
2
3
4
5
repeat
BytesRead := FileRead(filein,buffer,sizeof(Buffer));
if BytesRead > 0 then
if not InternetWriteFile(hRequest,@Buffer,BytesRead,BytesSent) then break;
until abort or (bytesread < sizeof(buffer));
0
саша40
-11 / 289 / 47
Регистрация: 14.08.2012
Сообщений: 2,533
31.05.2013, 15:57  [ТС] #19
Цитата Сообщение от chizz Посмотреть сообщение
од Delphi1
2
3
4
5
repeat
BytesRead := FileRead(filein,buffer,sizeof(Buffer));
if BytesRead > 0 then
if not InternetWriteFile(hRequest,@Buffer,BytesRead,BytesSent) then break;
until abort or (bytesread < sizeof(buffer));
а это что за код?
0
chizz
983 / 501 / 101
Регистрация: 19.03.2013
Сообщений: 3,104
Записей в блоге: 19
Завершенные тесты: 1
31.05.2013, 15:59 #20
код чтения и записи файла... разве не видно?
0
31.05.2013, 15:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2013, 15:59

Не устанавливается ФТП-сервер
Здравствуйте На компе стоит Вин7 Про х64 SP1. Сижу под СуперАдмином....

Домашний ФТП сервер
Установил ФТП-сервер FileZilla (см. http://www.dim565.ru/?Statmzi:Internet: ......

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru