[PHP] fwrite schrijft plaatje niet geheel weg

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Met behulp van mijn http-request functie doe ik een request naar een url waar een plaatje staat, bijvoorbeeld naar http://www.britney-federline.co.uk/images/frontimage.gif :9

Omdat de functie vrij lang is, zal ik hem niet hier wegzetten maar hier. Ik denk echter niet dat de fout daarin zit. Mijn probleem zit denk ik ergens in de verwerking van de request:

PHP:
1
2
3
4
5
6
define('BASE_PATH', 'c:/program files/apache2/htdocs/website/');

$request = http_request($_POST['url']);
$fp = fopen(BASE_PATH.'images/plaatje.gif', 'w');
fwrite($fp, $request->data);
fclose($fp);

Als ik vervolgens in de betreffende images-map kijk, is er inderdaad een bestandje aangemaakt met de naam plaatje.gif, grootte 35 KB, 260 bij 374 pixels groot. Alleen: als ik het plaatje wil bekijken, krijg ik een error (in FireFox):

code:
1
2
"The image http://www.website.com/images/plaatje.gif cannot be displayed, 
because it contains errors".
Gek genoeg kan ik http://www.website.com/images/plaatje.gif in de browser view-sourcen. Ik krijg dan de letterlijke stream van de http-request ($request->data) te zien: GIF89av÷...etc. Blijkbaar begrijpt PHP / Windows / Apache (?) niet dat ik een plaatje tracht binnen te halen...wat doe ik verkeerd? Ik zit er nu al uren op maar snap er helemaal niets van. Als het originele plaatje (hier: Britney) een gifje is, moet ik die stream toch gewoon in een ander .gif bestand kunnen wegschrijven?

[ Voor 21% gewijzigd door Reveller op 06-07-2005 16:10 . Reden: typo's ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • Parcye
  • Registratie: Maart 2001
  • Laatst online: 24-08-2017

Parcye

Mr C

Zover ik weet hoeft Apache/PHP/Windows niet te begrijpen wat je wegschrijft in een bestand, zolang het maar het zelfde is als wat je ophaalt.

Maar ik denk dat het probleem zich bevind in je zelf gemaakte functie. Namelijk het volgende:
PHP:
1
2
3
4
  while (!feof($fp) && $data = fread($fp, 1024))
  {
    $response .= $data;
  }


Als je dit anders oppakt, namelijk de 'read' in de while lus zet ipv in de while conditie. Daarnaast vraag ik me af waarom je bewerkingen door voert op de door jou ingeladen bytes. Zou je dit niet moeten laten zoals het is?

"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Parcye schreef op woensdag 06 juli 2005 @ 16:14:
[...]Als je dit anders oppakt, namelijk de 'read' in de while lus zet ipv in de while conditie [...]
Voor zover ik weet is er geen verschil in de read in de while lus of in de conditie
Daarnaast vraag ik me af waarom je bewerkingen door voert op de door jou ingeladen bytes. Zou je dit niet moeten laten zoals het is?
Daar heb je wel gelijk in! Deze functie is oorspronkelijk bedoeld voor het binnenhalen van html bestanden, en die werden geparsed op o.a. newlines. Dat is natuurlijk dodelijk bij de data van een plaatje. Dank je! Ik was ervan overtuigd dat die functie klopte, en het zou nog uren geduurd hebben voor ik hier zelf naar was gaan kijken :)

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

Plaatje is binaire data. Het lijkt me daarom ook handig om je bestand met wb te openen ipv met alleen w.

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!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Indien je de fopen-wrappers aan hebt staan kun je ook gewoon de file_get_contents()-functie gebruiken ;)

Het is inderdaad belangrijk 'wb' in je fopen aangezien het om binaire data gaat.