[PHP] streaming upload

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Situatie:

- ik wil een binary file uploaden van bv. 50MB -dat duurt een tijdje ;)
- andere clients moeten vrijwel direct nadat ik begin met up te loaden de file kunnen streamen
(via een andere php script dat wat bytes uitspuwt aan een variabele snelheid afhankelijk van hoe snel de upload gaat)

Vroeger deed ik form posts met elke 2KB data in, die ik dan appende aan de file. (pseudo upload dus)
Dat is echter niet efficiënt. Ik wil de connectie openhouden en de data gewoon in een keer sturen.

Ik heb ooit zoiets gemaakt in JSP, maar in PHP heb ik wat hulp nodig.

Ik heb dit in gevonden (upload wel, maar file is niet beschikbaar tijdens uploaden...
Het script wacht waarschijnlijk tot upload compleet is om voorbij de eerste regel te gaan :)

Da's dus net niet de bedoeling ;) In JSP kon ik de inputstream ophalen en daar mijn ding mee doen, wie helpt me? :) (is voor freeware projectje)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
        $infile = fopen($uploadedfile,"r");

        while(!feof($infile))
        {
            $temp=fread($infile,128);

            $outfile = fopen("./out.dat","a");
            fwrite($outfile,$temp,strlen($temp));
            fclose($outfile);
        }
        fclose($infile);

?>

Acties:
  • 0 Henk 'm!

  • ripperke
  • Registratie: Augustus 2003
  • Laatst online: 19-08 16:06

ripperke

w00t!

ik denk dat je opzoek bent naar $_POST["upload"]["tmp_name"] :)

If TCP/IP handshaking was less formal, perhaps SYN/ACK would be YO/WASSUP


Acties:
  • 0 Henk 'm!

Verwijderd

Het kan dus niet voor zover ik weet. De code wordt pas uitgevoerd als de request compleet is.

Acties:
  • 0 Henk 'm!

  • TheBorg
  • Registratie: November 2002
  • Laatst online: 20-09 18:24

TheBorg

Resistance is futile.

Verwijderd schreef op zaterdag 19 augustus 2006 @ 16:13:
Het kan dus niet voor zover ik weet. De code wordt pas uitgevoerd als de request compleet is.
Dat maakt niet uit, de file is gewoon beschikbaar in een andere sessie op de plek die ripperke aangeeft.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Ja, maar die plek weet je pas als het bestand helemaal binnen is. Voor die tijd wordt je script nog niet uitgevoerd en kun je $_FILE nog niet uitlezen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

@TheBorg, het is wel beschikbaar ja, maar je weet dus niet welk bestand het is, en dat is ook niet echt te voorspellen.

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • Javache
  • Registratie: Mei 2006
  • Laatst online: 13-02-2010
Als je browser een request verstuurt (post-data) zal al die data eerst doorgestuurd worden naar de servrer en daarna pas zal apache overgaan tot de verwerking. Dus zal het met gewone formulieren niet werken. Misschien kan je eens kijken naar AJAX (alhoewel veiligheidsinstellingen waarschijnlijk verhinderen dat javascript lokale bestanden kan verzenden)

Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Ik dacht dat het bestand door een post bewerking in de /tmp map werd geplaatst totdat hij helemaal klaar was. En ik dacht ook dat de naam van het tmp bestand in de $_FILES var kwam te staan. Het lastige alleen is als jij klaar bent met uploaden dan wordt het bestand verplaatst naar een dir, dus dan is het tmp bestand weg

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Megamind schreef op zaterdag 19 augustus 2006 @ 16:53:
Ik dacht dat het bestand door een post bewerking in de /tmp map werd geplaatst totdat hij helemaal klaar was.
Ongeveer, het komt in een temp map te staan en daar blijft het tenzij het script het voor je verplaatst.
En ik dacht ook dat de naam van het tmp bestand in de $_FILES var kwam te staan.
Klopt, maar die variabele kan je pas uitlezen _na_ het uploaden, niet tijdens.
Het lastige alleen is als jij klaar bent met uploaden dan wordt het bestand verplaatst naar een dir, dus dan is het tmp bestand weg
Niet automatisch, dat moet je zelf laten doen.

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Dat klopt MegaMind. En het bestand wordt niet verplaatst als jijzelf hier de opdracht (move_uploaded_file()) niet toe geeft.

Je PHP script wordt pas uitgevoerd nadat Apache het request heeft verwerkt. Apache heeft het request pas verwerkt nadat het volledige bestand is geupload, en in de tijdelijke map is gezet.
Je kunt echter met een 2de PHP-script gewoon dat tijdelijke bestand benaderen, welke Apache op dat moment aan he topbouwen is.
Truuk is alleen te bepalen welk bestand dat is, odmat je dit niet van te voren kunt definiëren.

Je zou de hele tmp-dir kunnen pollen en het bestand welke binnen een bepaalde interval groter is geworden als het juiste beschouwen.

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Ik denk dat ik een dergelijk probleem zou oplossen met een stuk java, daarmee heb je gewoon net iets meer mogelijkheden. Of eventueel cgi, dat zou ook mogelijk moeten zijn.

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wolfboy schreef op zaterdag 19 augustus 2006 @ 17:32:
Ik denk dat ik een dergelijk probleem zou oplossen met een stuk java, daarmee heb je gewoon net iets meer mogelijkheden. Of eventueel cgi, dat zou ook mogelijk moeten zijn.
De clientapplicatie is een .NET applicatie.
Ik snap de work-arround, maar om het nog lastiger te maken: verschillende mensen kunnen tegelijk aan het uploaden zijn :P

Dus 1 script verzorgt de upload; met een 2e PHP script kan ik die temp bestanden wel benaderen.
Maar probleem is dan wel wie dat 2e script gaat aanroepen. Als er verschillende mensen bezig zijn, kan ik moeilijk hun applicatie elk het script laten oproepen, want dan wordt het een rotzooi met veel fout gekopieerde shit :)
Of ik zou moeten weten wat de 'eigen' temp file is (bijhouden wie wat aan het moven is in een DB met soort locking is ook wel mogelijk in theorie, maar daar heb ik allemaal geen zin in)

Conclussie: niet echt te doen. (feature voor PHP6? :) )
Zou het mogelijk zijn in ASP.NET ? Ik vermoed van wel, heb daar toch al inputstreams gezien. (wel geen ervaring met uploaden daarin, maar swat)

Toch bedankt voor de hulp :)

Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 16:14

pietje63

RTFM

Interessant voor deze vraag is misschien een topic dat gaat over een upload-balk icm php.

Wat ik zal doen, ervan uitgaande dat jij de enige bent die upload, is in de temp map een bestand zoeken dat groter is dan (? 10Kb) en daar de nieuwste van pakken. Ik denk dat het jouw upload is; en dat bestand proberen uit te lezen.

Zoals anderen ook al aangeven is dit echter niet geheel praktisch met php.

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


Acties:
  • 0 Henk 'm!

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Als je met .NET werkt, kun je natuurlijk in het bestand dat je gaat versturen een aantal bytes toevoegen aan het begin voor het versturen.

Je tweede script kan dan eenvoudig opzoeken welk bestand het moet hebben aan de hand van de toegevoegde bytes. Script nummer 1 haalt deze bytes weer weg nadat de upload compleet is.

Ik ontken het bestaan van IE.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
cyberstalker schreef op zaterdag 19 augustus 2006 @ 22:37:
Als je met .NET werkt, kun je natuurlijk in het bestand dat je gaat versturen een aantal bytes toevoegen aan het begin voor het versturen.

Je tweede script kan dan eenvoudig opzoeken welk bestand het moet hebben aan de hand van de toegevoegde bytes. Script nummer 1 haalt deze bytes weer weg nadat de upload compleet is.
slim, had ik niet aan gedacht!
Pagina: 1