[PHP] Upload afbreken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mr_Blobby
  • Registratie: Mei 2000
  • Laatst online: 17:30
Ik zit eraan te denken om met getID3() de headers van mijn avi's te analyseren, zodat ik de gebruikte codec, afmetingen, framerate etc. in mysql kan opslaan. Daarvoor wil ik de avi kunnen uploaden en de upload afbreken zodra de header binnen is.

Is dit mogelijk?

en zij zagen niet hoe spot in mij worstelde met verdriet


Acties:
  • 0 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

Nee, niet in PHP. PHP krijgt pas de beschikking over het te uploaden bestand waneer het helemaal binnen is. Of het op andere manieren wel mogenlijk is vraag ik me ook af. Volgens mij kun je een request dat de browesr doet niet zomaar voortijdig laten afbreken door de server. Het zou heel goed kunnen dat dit ongedefinieerd gedrag van de browsers opleverd.

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!

  • RupS
  • Registratie: Februari 2001
  • Laatst online: 17-07 14:45
Ik denk niet dat het mogelijk is met php, omdat het php verhaal pas wordt uitgevoerd nadat de file is geupload...

Wat je zou kunnen doen (denk ik):
1. Client selecteert avi en drukt op upload;
2. jij start in een popup een php script dat na 5 secs. (oid.) het meeste recente bestand uit je tmp dir haalt;
3. je sluit de pop-up en breekt de upload met javascript af.

daarna zou je het bestand kunnen analyseren. Het is geen nette oplossing (verre van zelfs) maar ik zou niet weten hoe je het anders kan doen... :)

Acties:
  • 0 Henk 'm!

  • Mr_Blobby
  • Registratie: Mei 2000
  • Laatst online: 17:30
Janoz schreef op 09 maart 2004 @ 10:36:
...
Volgens mij kun je een request dat de browesr doet niet zomaar voortijdig laten afbreken door de server. Het zou heel goed kunnen dat dit ongedefinieerd gedrag van de browsers opleverd.
Wat gebeurt er dan als bijvoorbeeld de php setting "max_execution_time" of "post_max_size" wordt overschreden? Hoe komt de browser dan te weten dat het uploaden fout is gegaan? Pas nadat de hele file is geupload?

en zij zagen niet hoe spot in mij worstelde met verdriet


Acties:
  • 0 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

De executie van je script begint pas zodra het hele bestand binnen is. De tijd die verstrijkt tijdens het uploaden telt niet mee als execution time omdat het executen pas begint waneer dit klaar is. post_max_size geeft ook pas een foutmelding nadat je een iso (oid ;) ) geupload hebt. Dus ja, de browser hoort pas dat dit fout gegaan is na het uploaden, sterker nog. De browser hoort helemaal niks. Of hij krijgt gewoon een normale html pagina terug waarop vervolgens een foutmelding staat, of hij geeft een foutmelding omdat de socket gesloten is.

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!

  • Engineer
  • Registratie: Juni 2001
  • Laatst online: 03-07 23:56

Engineer

Software

.

[ Voor 98% gewijzigd door Engineer op 13-10-2018 10:57 ]


Acties:
  • 0 Henk 'm!

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 15-05 16:29

Macros

I'm watching...

Kan je beter een Java Applet schrijven die de file inleest en dan de gegevens door stuurd naar je database, is denk ik makkelijker dan een webserver schrijven.

"Beauty is the ultimate defence against complexity." David Gelernter


Acties:
  • 0 Henk 'm!

  • Mr_Blobby
  • Registratie: Mei 2000
  • Laatst online: 17:30
Janoz schreef op 09 maart 2004 @ 13:18:
De executie van je script begint pas zodra het hele bestand binnen is. ...
Dit blijkt niet het geval te zijn. Zodra de browser begint met uploaden, wordt via STDIN de ruwe upload-data doorgegeven aan het script. Dit heb ik getest door met perl de ruwe data weg te schrijven naar een bestand. Dit bestand wordt al direct gevuld zodra de upload begint. Nu probeer ik dit ook met php voor elkaar te krijgen, maar php vertoont ander gedrag t.a.v. STDIN.

Ter vergelijking de volgende twee stukjes code:
Perl:
1
2
3
4
5
$upload_data = "";
binmode (STDIN);
read (STDIN, $upload_data, 128);
print "Content-type: text/html\n\n";    
print $upload_data;
PHP:
1
2
3
4
5
6
7
<?php
  $upload_data = "";
  $stdin_handle = fopen("php://stdin","r");
  $upload_data = fgets($stdin_handle, 128);
  fclose($stdin_handle);
  echo "$upload_data";
?>

Perl leest wel van STDIN en laat wat zien, maar PHP laat niets zien (apache 1.3 op winxp).

Iemand een idee hoe dit komt?

en zij zagen niet hoe spot in mij worstelde met verdriet


Acties:
  • 0 Henk 'm!

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Je webbrowser laat het afhandelen van de uploaded data over aan je CGI-applicatie. In geval van php, zal php zelf eerst wachten totdat het bestand binnen is alvorens over te gaan tot executie van het script. Dus als je daarna vanuit het script gaat lezen van de stdin, dan zul je niets meer te lezen hebben. Dat heeft php al voor je gedaan. Met pearl gaat het anders: perl handeld zelf niet specifiek je stdin af. Dus dan kan je dit wel doen.

Is het trouwens niet zo dat een webserver pas een antwoord mag geven zodra hij de volledige request binnen heeft? In dat geval zul je dus nooit een upload op een nette manier kunnen afbreken.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]

Pagina: 1