Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kopiowanie plików przez http
Forum PHP.pl > Forum > PHP
SIR JEDI
Czy ktoś pisał skrypt do kopiowania danych z adresu URL i zapisywał je do pliku na serwerze? Np mam plik 30 Mb i chce żeby skrypt go skopiował na moje konto.

Używam funkcji fopen() i wszytko idzie ok... tylko że po pewnym czasie strumień danych się zrywa i skrypt po porstu kończy działalność.

funkcja set_time_out() ciągle zwieksza limit czasu, więc tutaj błędu nie ma. Czy ktoś jest w stanie mi udzielić pomocy?
KaMeLeOn
php.ini
Cytat
post_max_size = 8M
SIR JEDI
Nie o to chodzi. Tutaj jest kod: [php:1:8dd6d36695]<?php

$filename = "http://localhost/obrazek.jpg";
$filename2="obrazek2.jpg";


$f = fopen($filename, "rb");

flock($f, 1);

while(!feof($f)){

set_time_limit(31536000);
$file=fread($f, 1024*8);
$f2 = fopen($filename2, "ab");
flock($f2, 2);
fwrite($f2, $file);

flock($f2, 3);
fclose($f2);

unset($file);
unset($f2);

}
flock($f, 3);
fclose($f);

?>[/php:1:8dd6d36695]

I nie to że 8 Mb, bo bywało że transfer zatrzymywał się przy ok 3... Help...
adwol
Blokowanie zdalnego zasobu po HTTP... Ostre, naprawde ostre...
[php:1:b96f51212f]<?php
$filename = "http://localhost/obrazek.jpg";
$f = fopen($filename, "rb");
flock($f, 1);
?>[/php:1:b96f51212f]
Na takie coś bym nawet nie wpadł. Najpierw nikt nie blokował w ogóle plików, potem ktoś podrzucił flocka to teraz blokujemy co się da, nawet URLe, tak?
Po drugie, po co w pętli otwiersz ten plik w trybie append i co chwile go zamykasz? Po trzecie (to w zasadzie kosmetyka), zamiast ustawiać maksymalny czas wykonania na rok i do tego w pętli, ustaw raz na 0 -- wyłączy to licznik.

Spróbuj takiego kodu, jest trochę chudszy i jeśli dalej Ci nie będzie działało to znaczy, że problem leży po stronie połączenia sieciowego (chociaż do localhosta to raczej ciężkie do uzyskania :wink:).
[php:1:b96f51212f]<?php
$filename = "http://localhost/obrazek.jpg";
$filename2 = "obrazek2.jpg";

set_time_limit(0);

$f = fopen($filename, 'rb');
$f2 = fopen($filename2, 'wb');
flock($f2, 2);

while (!feof($f))
{
$file = fread($f, 1024*8);
fwrite($f2, $file);
}

fclose($f);
fclose($f2);
?>[/php:1:b96f51212f]
spenalzo
Na serwerach linuksowych jest jeszcze jedna możliwość:
[php:1:79e13b4133]<?php
passthru("wget http://serwer/plik.exe");
?>[/php:1:79e13b4133]
SIR JEDI
Ten problem jest nie do obejścia. Okazało się że serwer ma ustanione wykonywanie skryptów CGI -> timeout na 300 sekund...

Inna sprawa:
Czy ktoś wie czy da się jakoś zacząc pobierać dane z pliku na innym serwerze od danego bajta (miejsca) - takie wznawianie pobierania np od 1024 bajta z pliku http://serwer/plik.cad

Takie coś potrafi np FlashGet wysyłając jakiś nagłówek.

Powiedzmy że używam fsockopen do nawiązania połaczenia z plikiem. Czy da się wysłać taki nagłówek, żeby ptrzymywać informacje od podanego miejsca?questionmark.gif

Na plikach na tym samym serwerze można używać fseek() ale przez http:// nie działa...
FiDO
Przeciez flashget ladnie pokazuje jakie naglowki wysyla.. wiec mozesz podpatrzec jak on to robi i sprobowac sam.
Z tym ze aby mozna bylo zaczac od dowolnego miejsca sciagac serwer musi wspierac resuming, co prawda wiekszosc wspiera, ale zdarzaja mi sie jeszcze czasem rodzynki, ktore tego nie robia.
adwol
Cytat
Powiedzmy że używam fsockopen do nawiązania połaczenia z plikiem. Czy da się wysłać taki nagłówek, żeby ptrzymywać informacje od podanego miejsca?questionmark.gif

W HTTP/1.1 jest Range. Np. nagłówek
Kod
Range: bytes=15-30

zwróci bajty od 15 do 30 włącznie.
SIR JEDI
Danke :-) Wpadłem na to zaraz po wyslaniu posta, ale o drugiej liczbie nie wiedziałem :-)
cygi
mam pytanko wiem ze temat byl juz troche czasu temu ale interesuje mnie to range.

chce przeczytac plik gigowy i go sparsowac. caly na raz niema szans wiadomo dlaczego, wiec proboje czytac kilkaset lini a pozniej dalej ale niebardzo moge usunac te linie ktore przeczytam, wiec gdy znalazlem tego posta to bardzo mnie to zaciekawilo ale nigdzie nic wiecej na ten temat niemoge znalesc. bardzo bym prosil o jakas wskazuwke jak to wykorzystac
adwol
Cytat
nigdzie nic wiecej na ten temat niemoge znalesc.

A czego szukasz? Specyfikacji, przykładu użycia czy jeszcze czegoś innego?
Cytat
bardzo bym prosil o jakas wskazuwke jak to wykorzystac

Tak jak napisałem. Dodajesz w żądaniu HTTP/1.1 nagłówek Range: i w wyniku otrzymujesz tylko ten zakres bajtów który podałeś. Skorzystaj z CURLa, bo w nim chyba najrpościej to zrobić.
cygi
niestety nieznalazlem nic w miare prosto opisane jak sie go CURL ze nawet file() ktora wrzuca go w prosta tablice wymieka przy nim. wiec chce przeczytac kilkaset lini , najlepiej bylo by pozniej usunac te linie (ale z tego co sie wyczytalem to niemoge usunac lini z poczatku pliku ,jezeli go nieprzeczytam calego ) wywolac sam siebie i znow to samo , i tak kilkakrotnie dopoki nieznajdzie znacznika konca plku
adwol
Zaraz, zaraz! Skąd Ty ten plik bierzesz? Z lokalnego dysku? Jak tak to niniejszy wątek nie jest na ten temat i nagłówek Range protokołu HTTP nic Ci nie pomoże, bo w ogóle nie ma sensu go używać.
cygi
teraz juz wiem ale jak to zobaczylem to mi tak przyszlo do glowy ze moze pomoze, ale juz mam chyba sposob i przy okazji pytanko moze bedziesz wiedzial:
wykonuje mniejwiecej:
[php:1:a6db9ae075]<?php
$licznik=1;
$fd = fopen ($pliklokal,"r");
while ($licznik!=10) {
//print '<BR><FONT color=#FF0000>'.$licznik.'</FONT><BR>';
$licznik++;
$buffer = fgets($fd, 4096);
// echo $buffer;
//parsuje i laduje do bazy $buffer
}

?>[/php:1:a6db9ae075]
i tu chce zbadac ktory to bajt i przeladowac strone i wykonac
[php:1:a6db9ae075]<?php
fseek($fd, 'ten_bajt);
?>[/php:1:a6db9ae075]
i powtorzyc to tyle razy ile bedzie trzeba
niewiem jak nie liczac w php teg wszystkiego co mi zwraca podac ktory to bajt (dlatego niechce tego liczyc aby skrocic wykonywanie skryptu.
przyposzczam ze fseek wstawia cos i podaje ktory to bajt ale wlasnie tego niewiem jak to zrobic
jak bys wiedzial to bylbym bardzo wdzieczny
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.