powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Как узнать, завершилась ли загрузка удачно?
12 сообщений из 12, страница 1 из 1
Как узнать, завершилась ли загрузка удачно?
    #33719845
Фотография nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть страница с прямыми линками на загрузку
Задача: Если загрузка файла завершилась удачно, то пишем в базу статус ок , иначе, в случае ошибки или если пользователь отменил загрузку, пишем в базу статус fault
Код: plaintext
1.
2.
...
<a href="http://myserver.com/my_prog.exe">download my_prog</a>
...
Пользователь кликает на линк, открывается диалог сохраниения файла.
Нажимаем сохранить.
Вопрос: Как узнать, завершилась загрузка удачно или нет?
...
Рейтинг: 0 / 0
Как узнать, завершилась ли загрузка удачно?
    #33719864
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо, в общем случае - никак.
например, если пользователь с диалапом применяет менеджер закачек, то может быть закачано несколько десятков и даже сотен фрагментов файла с разбросом по клиентским ip-адресам и во времени до нескольких суток.
...
Рейтинг: 0 / 0
Как узнать, завершилась ли загрузка удачно?
    #33719870
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если файл прочтен до конца - можно считать удачной. если нет - нет.
файл надо отдавать не прямо с диска, а через свой скрипт, который и будет
всё это отслеживать и писать в базу.

P.S. Тока докачку предусмотри. А то неприятно...
По себе помню, когда на модеме ещё сидел...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Как узнать, завершилась ли загрузка удачно?
    #33719913
Фотография nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lissyara
файл надо отдавать не прямо с диска, а через свой скрипт, который и будет
всё это отслеживать и писать в базу.

Мне все как-то смутно представляется.
А можно примнрный алгоритм реализации?
...
Рейтинг: 0 / 0
Как узнать, завершилась ли загрузка удачно?
    #33720095
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lissyaraесли файл прочтен до конца - можно считать удачной.
так, насколько я понимаю, проблема и заключается именно в определении факта "файл прочтен до конца"...

дкумаю, проблемы можно разбить на две:
1) идентификация пользователя.
2) отслеживание фактов закачки фрагментов файла каждым из пользователей.
т.к. каждый из пунктов не решаем со 100% точностью, то предлагаю просто учитывать факты начала загрузки.
...
Рейтинг: 0 / 0
Как узнать, завершилась ли загрузка удачно?
    #33720644
JackS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в принципе есть способ но он жутко жестокий ...
1 - идентификация пользователя - нужно знать кто
2 - через свой скрипт отдавать ...
смотреть размер файла при начале закачки
скрипт читает по хз сколько байт/килобайт и отдаёт юзеру + подсчитывает в
сумме что отдал ... сумма совпала с размером - сукчес, не совпала - не сукчес ...
как и где хранить промежуточные - дело хозяйское ... но при этом способе есть определённая уверенность
...
Рейтинг: 0 / 0
Как узнать, завершилась ли загрузка удачно?
    #33720693
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня так. незнаю наскока верно-неверно...
я ставил эксперименты флашгетами всякими - вроде не врёт.
Код: plaintext
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.
$file_for_download = "../files_for_download/" . $file_massiv['path_to_file'] . "/" . $file_massiv['real_file_name'];
//
if (isset($_SERVER)){ $server = &$_SERVER; }else{ $server = &$GLOBALS["HTTP_SERVER_VARS"]; }
// достаём время последней модификации файла
$data_mod = @filemtime($file_for_download);
// узнаём размер файла
$size = @filesize($file_for_download);
// открываем файл
$handle = @fopen($file_for_download, "rb");
// если задан HTTP_RANGE то файл хотят кусками.
if (isset($server["HTTP_RANGE"])){
// достаём байты, с которых хотят файл
preg_match ("/bytes=(\d+)-/", $server["HTTP_RANGE"], $m);
// считаем новый размер отдаваемого куска файла
$contentSize = $size - intval($m[ 1 ]);
// откуда отдавать
$p1 = $size - $contentSize;
// до куда отдавать
$p2 = $size -  1 ;
// размер файла
$p3 = $size;
// указываем смещение
fseek ($handle, $p1);
// выдаём заголовки
header ("HTTP/1.1 206 Partial Content");
header('Last-Modified: ' . date('D, d M Y H:i:s \G\M\T' , $data_mod));
header ("Cache-Control: None");
header ("Pragma: no-cache");
header ("Accept-Ranges: bytes");
header('Content-Disposition: attachment; filename="' . $file_massiv['real_file_name'] . '"');
header ("Content-Range: bytes " . $p1 . "-" . $p2 . "/" . $p3);
header ("Content-Length: " . $contentSize);
header ("Content-Type: application/octet-stream");
header ("Proxy-Connection: close");
header ("");
}else{
// файл хотят целиком
$contentSize = $size;
header ("HTTP/1.1 200 OK");
header('Last-Modified: ' . date('D, d M Y H:i:s \G\M\T' , $data_mod));
header ("Cache-Control: None");
header ("Pragma: no-cache");
header ("Accept-Ranges: bytes");
header('Content-Disposition: attachment; filename="' . $file_massiv['real_file_name'] . '"');
header ("Content-Length: " . $contentSize);
header ("Content-Type: application/octet-stream");
header ("Proxy-Connection: close");
header ("");

}
// отдаём файл
@fpassthru($handle);
// Надо добавить в БД единичку к счётчику скачиваний
$sql_update = "UPDATE `downloads_table` SET `download_count` = `download_count` + 1 WHERE `file_for_download` = '" . $file_id . "'";
mysql_query("$sql_update");
// закрываем файл
@fclose($handle);
...
Рейтинг: 0 / 0
Как узнать, завершилась ли загрузка удачно?
    #33720712
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JackSсумма совпала с размером - сукчес, не совпала - не сукчес ...тогда уж надо не смотреть сумму, а вычислять объединение, т.к. есть качалки, которые "откатываются" на несколько Кб назад при ошибке закачки какого-то фрагмента и тогда сумма скачанного будет больше размера файла.

А еще пользователь может удалить начатую закачку вообще и начать качать заново...
JackSкак и где хранить промежуточные - дело хозяйское ...
хранить информацию о каждом фрагменте, да еще в течение приличного времени (имхо, не менее недели, если закачка еще не признана успешной), да еще с непонятно какой привязкой к пользователю - дело, имхо, накладное...
JackSно при этом способе есть определённая уверенностьне вижу я тут увернности ни на грамм
...
Рейтинг: 0 / 0
Как узнать, завершилась ли загрузка удачно?
    #33720735
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lissyaraу меня так. незнаю наскока верно-неверно...
я ставил эксперименты флашгетами всякими - вроде не врёт.
приведенный скрипт:
1) считает количество скачанных фрагментов, а не файлов
2) не учитывает, что запрос может содержать верхнюю границу фрагмента не совпадающую с концом файла.
...
Рейтинг: 0 / 0
Как узнать, завершилась ли загрузка удачно?
    #33720880
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хе-хе...
за последние полгода код эволюционировал во что-то не то
вечером буду дома дома - выложу старый - где нормально ещё было.
а этот да, куски считает

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Как узнать, завершилась ли загрузка удачно?
    #33721639
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
разницы-то :) этот считает верно.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
...........skipped..............
header ("Content-Length: " . $contentSize);
header ("Content-Type: application/octet-stream");
header ("Proxy-Connection: close");
header ("");
// Надо добавить в БД единичку к счётчику скачиваний
$sql_update = "UPDATE `downloads_table` SET `download_count` = `download_count` + 1 WHERE `file_for_download` = '" . $file_id . "'";
mysql_query("$sql_update");
}
// отдаём файл
fpassthru($handle);
// закрываем файл
fclose($handle);
...
Рейтинг: 0 / 0
Как узнать, завершилась ли загрузка удачно?
    #33722899
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lissyaraразницы-то :) этот считает верно.
Не совсем понятно, куда относится это фрагмент, т.к. в исходном скрипте два подходящих места.

В любом случае, это не выход, т.к. считать будет либо только фрагменты, либо только целые файлы, либо в сумме. Все три варианта никак не контролируют успешность завершения закачки, про которую спрашивал автор.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Как узнать, завершилась ли загрузка удачно?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]