![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 308 Pomógł: 13 Dołączył: 31.10.2008 Ostrzeżenie: (0%) ![]() ![]() |
Cześć,
użytkownik pobiera plik z serwera za pomocą curl. Jak zliczyć ile danych pobrał? Plik ma dajmy 100 mb, ale zatrzymał pobieranie w połowie, jak to zliczyć? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Zapoznaj się w CURL z CURLOPT_WRITEFUNCTION oraz CURL_GETINFO czy jakoś tak - pozwala to na zapisywanie pliku po określonych chunk'ach (częściach o danym rozmiarze bajtów) można wówczas zapisywać gdzieś ile bajtów się pobrało. Po wykrzaczeniu ta zmienna będzie miała wielkość pobranego do tej pory pliku.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 308 Pomógł: 13 Dołączył: 31.10.2008 Ostrzeżenie: (0%) ![]() ![]() |
Działa całkiem fajnie, tylko jest problem tego typu, że jeśli pobieram plik ze swojego serwera za pomocą jakiegoś akceleratora pobierania który nawiązuje kilka połączeń do pliku to przekłamuję ilość pobranych danych nawet o kilka mb. Funkcja wygląda tak:
Przyjrzałem się dzisiaj sprawie dość dokładnie i wygląda na to, że programy przyspieszające pobieranie, zwiększają ilość danych. Po zapisaniu do pliku, faktycznie jego wielkość jest taka jak zostało wyliczone. Wychodzi na to, że podczas kilku połączeń pewne cześć pliku zazębiają się i dane są powielane. Sam plik po pobraniu działa. Może ktoś ma większą wiedzę na ten temat i się wypowie? |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 711 Pomógł: 127 Dołączył: 5.07.2008 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Akceleratory pobierania często dzielą plik na kilka części (nagłówek HTTP_RANGE) i raczej nie zazębiają kolejnych partów bo i po co. Pamiętaj że każde żądanie to nie tylko treść pliku ale i nagłówek http więc on może zawyżać ilość wysłanych danych.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 308 Pomógł: 13 Dołączył: 31.10.2008 Ostrzeżenie: (0%) ![]() ![]() |
Sprawdziłem i jest faktycznie tak jak mówiłem. Free Download Manager wysyła zapytanie do serwera:
Cytat GET /pliki/test.txt HTTP/1.1 Accept: */* Range: bytes=8451356- User-Agent: FDM 3.x Connection: Keep-Alive Cache-Control: no-cache Czyli wysyła informację od której miejsca chce zacząć, a nie podaje w którym miejscu chce kończyć. Ja natomiast odsyłam do programu coś takiego: Cytat HTTP/1.1 206 Partial Content Date: Wed, 02 Nov 2011 09:45:06 GMT Server: Apache Content-Range: bytes 8451356-9014779/9014780 Content-Length: 563424 Accept-Ranges: bytes Content-Disposition: attachment; filename=test.txt Vary: Accept-Encoding,User-Agent Keep-Alive: timeout=2, max=100 Connection: Keep-Alive Content-Type: application/force-download Muszę podać bajty na których skończy się pobieranie inaczej program wyświetli komunikat, że serwer nie wznawia pobierania. Za pomocą CURLOPT_WRITEFUNCTION zapisywałem pobierane dane z każdego połączenia do osobnego pliku na serwerze. Po sprawdzeniu - faktycznie mają taką wielkość jaka jest zliczana podczas pobierania. Natomiast po otwarciu, sprawdziłem i pobrane dane powielają się. Jak rozwiązać ten problem? |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 02:06 |