[PHP] File download/loop

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • DimitryK
  • Registratie: Maart 2009
  • Laatst online: 13-09 19:48
Hey mensen,

ik zit met een probleempje. Ik probeer een website gallery ripper te maken. Deze ripper werkt maar op 1 enkele site.

Het idee is als volgt:
Homepage -> Fetch pagina nummers -> Voor iedere pagina -> Zoek albums -> Zoek afbeeldingen -> Download afbeelding.

Ik heb een prototype dat gedeeltelijk werkt, maar het werkt niet zoals het hoort naar mijn mening. Het bestaat eigenlijk alleen maar uit preg_matches voor de links, en voor iedere link is een "for" of "foreach" statement.

Wat er nou telkens gebeurt is het volgende. De pagina begint met laden, en blijft maar laden totdat deze klaar is met het leeghalen van de albums/uitvoeren van het script. Verder doet het niks.

Wat ik nou wil bereiken is het volgende. Zodra het script begint moet deze een 'div' creëren. Hierin moet dan de volgende informatie worden weergegeven:

Page 1
- Album 1 / Found
- Album 2 / Found
...
- Album 16 / Found

Daarna, als het album is gedownload moet het woord "Found" veranderen in "Downloaded".

Hoe kan ik dit bereiken in een loop? Is er een manier waarop ik een soort van wachtrij kan creëren?

Bij voorbaat dank.

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Indien je de tekst wilt vervangen zonder het vernieuwen van de pagina ga je JavaScript nodig hebben. Je kunt het eventueel zo doen: "Album 1 / Downloading / Completed"

Mijn advies: Keep it simple :Y)

Acties:
  • 0 Henk 'm!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 18-09 16:24

mulder

ik spuug op het trottoir

En ga maar eens lezen wat het verschil is tussen client-side en server-side ;)

oogjes open, snaveltjes dicht


Acties:
  • 0 Henk 'm!

  • DimitryK
  • Registratie: Maart 2009
  • Laatst online: 13-09 19:48
mulder schreef op vrijdag 03 september 2010 @ 16:12:
En ga maar eens lezen wat het verschil is tussen client-side en server-side ;)
Voor wie is die opmerking bedoeld? Want ik weet wat het verschil is tussen client-side en server-side.

Het is alleen dat ik al verschillende php + ajax scripts heb gezien (Bijv. Rapidleech) waarbij men een bestand download van een andere server. Hierbij wordt dan ook een progressbar weergegeven en welke bestanden zijn gedownload en/of nog in de wachtrij staan.

Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 12:59
Ik zou een progressbar gebruiken. Je kunt dmv php steeds output flushen (in een iframe). Deze output is steeds een kort script:

JavaScript:
1
2
3
<script type="text/javascript">
parent.updateProgressBar('Nieuwe status: Gevonden', 1);
</script>


Je moet wel output compressie uit hebben in PHP en natuurlijk moet de functie updateProgressBar bestaan in het bovenliggende window-element.

"Chaos kan niet uit de hand lopen"


Acties:
  • 0 Henk 'm!

  • jbdeiman
  • Registratie: September 2008
  • Laatst online: 19:44
@DimitryK
Je zult deels Server Sided en deels cliënt sided moeten scripten.
Het mooist is als je op een pagina de afbeeldingen telt. Vervolgens haal je een afbeelding op en kan je vanaf je server teruggeven (use AJAX for this) dat er 1 van de ... afbeeldingen binnen is. Zijn ze allemaal binnen kan je tonen dat 20 van de 20 afbeeldingen binnen zijn, maar: Je kan ook aangeven dat ze allemaal binnen zijn.

Acties:
  • 0 Henk 'm!

  • DimitryK
  • Registratie: Maart 2009
  • Laatst online: 13-09 19:48
Dit is hoe de huidige code eruit ziet. Het is behoorlijk rommelig, maar het is nog maar een test script :)
Het is ook niet nuttig, irrelevant voor je probleem en daarom is het er nu niet meer :)

[ Voor 91% gewijzigd door MueR op 03-09-2010 16:36 . Reden: Weg die lap ]


Acties:
  • 0 Henk 'm!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 18-09 16:24

mulder

ik spuug op het trottoir

Tja, dan zou ik mij in AJAX gaan verdiepen. Wat je nu gemaakt hebt moet flink verbouwd worden om te bereiken wat je wilt. Je zult de status van je for-loop moeten kunnen exposen aan een andere script/functie, en die met ajax calls ophalen.

oogjes open, snaveltjes dicht


Acties:
  • 0 Henk 'm!

  • DimitryK
  • Registratie: Maart 2009
  • Laatst online: 13-09 19:48
Ik zat te denken aan een systeem dat pagina voor pagina de albums bekijkt.

Dus zoiets als:
Pagina 1 -> open album -> download afbeeldingen -> geef aan dat downloaden klaar is -> verder naar volgende pagina -> etc etc.

Ik neem aan dat ik dit niet zomaar voor elkaar ga krijgen in de huidige for-loop.

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 15-09 09:10
Waarom rip je niet gewoon alle afbeeldingen op de site? Dat er dan een aantal onnuttige inzitten is dan toch niet relevant?

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
DimitryK schreef op vrijdag 03 september 2010 @ 16:47:
Ik zat te denken aan een systeem dat pagina voor pagina de albums bekijkt.

Dus zoiets als:
Pagina 1 -> open album -> download afbeeldingen -> geef aan dat downloaden klaar is -> verder naar volgende pagina -> etc etc.

Ik neem aan dat ik dit niet zomaar voor elkaar ga krijgen in de huidige for-loop.
Waarom zou zoiets niet mogelijk zijn in een basis for loop? Je hoeft alleen (voorbeeld) maar een variabele in te stellen om te controleren of de download wel compleet is. (Je kunt heel veel met simpele array's).

Je hebt bij preg_match(_all) een extra parameter genaamd '$matches', doe daar een count op en controleer of je alle afbeeldingen binnen hebt.


Simpel voorbeeld:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
preg_match("regex", $albumstring, $albums);
preg_match("regex", $photostring, $photos);

for($i = 0; $i < count($albums); $i++) {
    echo '<span id="album_'.$i.'">Album '.$i.' / Found</span>';
    
    for($j = 0; $j < count($photos); $j++) {
        if($j === count($photos)-1) {
            //We zijn aangekomen bij de laatste foto.
        }
        
        //Andere acties zoals opslaan / weet ik wat
    }
}


Ik zeg er even bij dat ik dit niet heb getest, dat het erg simpel is en dat het beter kan. Dit dient dan ook als een klein voorbeeldje dat het wel mogelijk is. ;)
Verwijderd schreef op vrijdag 03 september 2010 @ 23:52:
Je zult met ob_start en ob_flush/flush moeten gaan werken om dit voor elkaar te krijgen, het voorbeeld van manuel kan wel werken maar dat werkt niet span per span maar zoals mulder het zegt wordt het door php in 1 x geparsed.

Met de output buffering functies van php moet je heel ver komen :)

[ Voor 21% gewijzigd door Manuel op 04-09-2010 11:48 ]


Acties:
  • 0 Henk 'm!

  • DimitryK
  • Registratie: Maart 2009
  • Laatst online: 13-09 19:48
Manuel schreef op vrijdag 03 september 2010 @ 17:33:
[...]

Waarom zou zoiets niet mogelijk zijn in een basis for loop? Je hoeft alleen (voorbeeld) maar een variabele in te stellen om te controleren of de download wel compleet is. (Je kunt heel veel met simpele array's).

Je hebt bij preg_match(_all) een extra parameter genaamd '$matches', doe daar een count op en controleer of je alle afbeeldingen binnen hebt.

Simpel voorbeeld:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
for($i = 0; $i < count($albums); $i++) {
    echo '<span id="album_'.$i.'">Album '.$i.' / Found';
    
    for($j = 0; $j < count($photos); $j++) {
        if($j === count($photos)-1) {
            //We zijn aangekomen bij de laatste foto..
            //Updaten van de status kan op vele manieren.. But let's keep it simple
            echo "<script type=\"text/javascript\">document.getElementById('album_{$i}').innerText = 'Album {$i} / Completed';</script>"; //Of innerHTML
        }
        
        //Andere acties zoals opslaan / weet ik wat
    }
}


Ik zeg er even bij dat ik dit niet heb getest, dat het erg simpel is en dat het beter kan. Dit dient dan ook als een klein voorbeeldje dat het wel mogelijk is. ;)
Bedankt, hier kom ik een heel eind mee :)

Acties:
  • 0 Henk 'm!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 18-09 16:24

mulder

ik spuug op het trottoir

Manuel schreef op vrijdag 03 september 2010 @ 17:33:
[...]

Waarom zou zoiets niet mogelijk zijn in een basis for loop? Je hoeft alleen (voorbeeld) maar een variabele in te stellen om te controleren of de download wel compleet is. (Je kunt heel veel met simpele array's).

Je hebt bij preg_match(_all) een extra parameter genaamd '$matches', doe daar een count op en controleer of je alle afbeeldingen binnen hebt.

Simpel voorbeeld:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
preg_match("regex", $albumstring, $albums);
preg_match("regex", $photostring, $photos);

for($i = 0; $i < count($albums); $i++) {
    echo '<span id="album_'.$i.'">Album '.$i.' / Found</span>';
    
    for($j = 0; $j < count($photos); $j++) {
        if($j === count($photos)-1) {
            //We zijn aangekomen bij de laatste foto..
            //Updaten van de status kan op vele manieren.. But let's keep it simple
            echo "<script type=\"text/javascript\">document.getElementById('album_{$i}').innerText = 'Album {$i} / Completed';</script>"; //Of innerHTML
        }
        
        //Andere acties zoals opslaan / weet ik wat
    }
}


Ik zeg er even bij dat ik dit niet heb getest, dat het erg simpel is en dat het beter kan. Dit dient dan ook als een klein voorbeeldje dat het wel mogelijk is. ;)
Ow ja dit werkt? Aantoonbaar?

oogjes open, snaveltjes dicht


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
mulder schreef op vrijdag 03 september 2010 @ 18:25:
[...]
Ow ja dit werkt? Aantoonbaar?

Wat ook een uitgebreide reactie weer, maar goed. Het werkt gewoon zoals het zou moeten werken. Ik heb zojuist ook even een test gedaan en het werkt gewoon. (In totaal 10 array's met daarin 100 foto's, hier heb ik geen andere logica bij in gedaan zoals het wegschrijven van het bestand. Als ik dat ga doen dan is het geen simpel voorbeeld meer)


Mijn fout, verkeerd voorbeeld.

[ Voor 58% gewijzigd door Manuel op 04-09-2010 11:47 ]


Acties:
  • 0 Henk 'm!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 18-09 16:24

mulder

ik spuug op het trottoir

Over het algemeen kun je serverside geen clientside bewerkingen doen. Wat je nu doet is een stuk pagina versturen, en daar nog wat javascript achteraan sturen, terwijl de pagina dus 'onderweg' is.

oogjes open, snaveltjes dicht


Acties:
  • 0 Henk 'm!

Verwijderd

Je zult met ob_start en ob_flush/flush moeten gaan werken om dit voor elkaar te krijgen, het voorbeeld van manuel kan wel werken maar dat werkt niet span per span maar zoals mulder het zegt wordt het door php in 1 x geparsed.

Met de output buffering functies van php moet je heel ver komen :)

Acties:
  • 0 Henk 'm!

  • DimitryK
  • Registratie: Maart 2009
  • Laatst online: 13-09 19:48
Verwijderd schreef op vrijdag 03 september 2010 @ 23:52:
Je zult met ob_start en ob_flush/flush moeten gaan werken om dit voor elkaar te krijgen, het voorbeeld van manuel kan wel werken maar dat werkt niet span per span maar zoals mulder het zegt wordt het door php in 1 x geparsed.

Met de output buffering functies van php moet je heel ver komen :)
Bedankt voor de tip, over output buffering zal ik vast wel een hoop kunnen vinden, dus daar kom ik dan wel uit.
Dat het voorbeeld van manuel in 1 keer geparsed wordt had ik zelf eigenlijk ook al kunnen bedenken, gezien hetzelfde gebeurde met de output van mijn eigen script. Deze kwamen ook pas in beeld toen het script klaar was.

Acties:
  • 0 Henk 'm!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 18-09 16:24

mulder

ik spuug op het trottoir

Het voorbeeld van Manuel is imho op hetzelfde principe gebaseerd, je stuurt vroegtijdig output naar de browser zodat deze al wat kan tonen. Output buffering is volgens mij bedoeld voor performance en volgens mij kun je ook niet garanderen dat elke browser er (hetzelfde) mee omgaat.

oogjes open, snaveltjes dicht


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Mijn fout inderdaad, sorry voor de verwarring. :) Het lijkt mij het makkelijkste om de status eventueel ergens heen te schrijven (HDD/geheugen/inlinepush/......) om het dan met een ander script te controleren zoals de andere gebruikers hier reageren.

Acties:
  • 0 Henk 'm!

  • DimitryK
  • Registratie: Maart 2009
  • Laatst online: 13-09 19:48
Heb het script gedeeltelijk herschreven, het maakt nu gebruik van output buffering en werkt geheel naar behoren. Nu nog wat javascript erin, en dan is het helemaal klaar :)

Iedereen die mij geholpen heeft hier, hartelijk bedankt ;)
Pagina: 1