Newsgroup: it.comp.www.php
Titolo: Dubbio (HTTP?)

Non capisco una cosa, vediamo se qualcuno di voi me la spiega..
Questo č il codice per ottenere un file memorizzato in un campo di
tipo blob (un'immagine nella fattispecie):
<?php
  if($_GET["id"])
  {
    [cut]
 
    $result = MYSQL_QUERY("select copertina from libri where
codice=$_GET[id]");
    $data = MYSQL_RESULT($result,0,"copertina");
    header("Content-type: image/jpeg");
    print $data;
  }
?>
Ebbene tale codice sta dentro ad un file (getfile.php) che viene
richiamato da una qualunque altra parte cosě:
<IMG src="getimage.php?id=384">
Fin qui niente di strano.
Quello che mi sfugge č: perchč il codice PHP per ottenere l'immagine
deve essere dentro ad un file (getfile.php) e non puň piů
semplicemente essere una funzione. Ok, c'č l'header da inviare, ma ho
visto che se lo commento tutto funziona lo stesso.. quello che mi
sfugge č perchč debba per forza essere in una pagina PHP a sč stante.
Forse č per qualcosa legato all'HTTP..
Mhaxx

 sfugge è perchè debba per forza essere in una pagina PHP a sè stante.
Dimmi come vorresti metterlo e ti diro' per quale motivo non funziona.
-- 
I'am what I'am, I do what I can

Dimmi come vorresti metterlo e ti diro' per quale motivo non funziona.
Vorrei che quel codice fosse una funzione per es, naturalmente dovrei
metterlo in testa ad una pagina web, visto che ha un header da
inviare. Ma non credo funzioni, io ho provato ma non andava.. a te
funziona?
Mhaxx

 funziona?
Ma che cosa vuoi fare, puo' tranquillamente essere una funzione.
Logicamente non puoi mandare in output altro ne prima ne dopo.


Logicamente non puoi mandare in output altro ne prima ne dopo.
Neppure dopo un header? Come sarebbe..
Mhaxx

 Neppure dopo un header? Come sarebbe..
Per "mandare in output" intendo print print_r echo etc.


>Posta il codice-
E' quello del primo post.
Dove c'è cut aggiungi la connessione al db..
Mhaxx

Mhaxx wrote:

Posta il codice con la versione funzione che non ti funziona.


>Posta il codice con la versione funzione che non ti funziona.
<?php
function getfile()
{
  header("Content-type: image/jpeg");
  $fp = fopen(NOME_FILE, "rb");
  $data = fread($fp, filesize(NOME_FILE));
  fclose($fp);
  print $data;
}
?>
Sono riuscito a fare un prova senza DB.. come vedi prendo una immagine
jpeg dal disco fisso e la "scrivo". Ecco dove richiamo la funzione:
<IMG src="<?php getfile() ?>">
Se provi a sostituire NOME_FILE con un tuo file jpeg vedi che non
funziona. Se perň prendi il corpo della funzione, lo metti in un file
separato chiamato getfile.php:
<?php
  header("Content-type: image/jpeg");
  $fp = fopen(NOME_FILE, "rb");
  $data = fread($fp, filesize(NOME_FILE));
  fclose($fp);
  print $data;
?>
e lo richiami cosě:
<IMG src="getfile.php">
allora vedi che ti funziona!
Mhaxx

 allora vedi che ti funziona!
certo, perchè la funzione la devi pur richiamare, non solo dichiarare!
il codice diventa
<?php
function blabla() {
...
}
blabla();
?>
e vedrai che funziona,
ciao

 allora vedi che ti funziona!
I tuoi dubbi riguardano il funzionamento globale dell'HTTP, dell'HTML e
del PHP.
Quello che vuoi fare e' tecnicamente fattibile, ma quello che hai
realizzato e' concettualmente sbagliato.
<?php
//File getfile.php
function getfile($nomefile = "")
{
  header("Content-type: image/jpeg");
  $fp = fopen($nomefile, "rb");
  $data = fread($fp, filesize($nomefile));
  fclose($fp);
  print $data;
}
if (isset($_GET["nomefile"])) { getfile($_GET["nomefile"]); }
?>
All'interno di una pagina inserisci il codice:
<img src="getfile.php?nomefile=miajpeg.jpg">


>certo, perchè la funzione la devi pur richiamare, non solo dichiarare!
Certo che la richiamo la funzione:
<IMG src="<?php getfile() ?>">
Nel secondo caso, quando cioè metto il corpo della funzione in un file
chiamato getfile.php, allora non devo richiamare il nome del file:
<IMG src="getfile.php">
Ripeto: nel PRIMO caso (quello della funzione) non funziona, nel
secondo invece funziona (quello del file contenente il corpo della
funzione).
Mhaxx

<img src="getfile.php?nomefile=miajpeg.jpg">
Anche a me funzionava il file getfile.php, ANCHE SENZA incapsularlo
dentro ad una funzione!
Forse mi sono spiegato male.. a me interessava poter avere il codice
che che ti "carica" un'immagine nello stesso file in cui se ne fa uso,
cioè dove hai il tag IMG per capirci. In pratica non capisco perchè
questo codice (dentro o fuori una funzione) debba stare in un file
separato: tutto qui! Vorrei sapere se si può o meno..
Mhaxx

 separato: tutto qui! Vorrei sapere se si può o meno..
Ti ripeto i tuoi dubbi riguardano il funzionamento globale dell'HTTP,
dell'HTML e del PHP.
Riproviamo
<?php
//File quellochevuoi.php
function getfile($nomefile = "")
{
  header("Content-type: image/jpeg");
  $fp = fopen($nomefile, "rb");
  $data = fread($fp, filesize($nomefile));
  fclose($fp);
  print $data;
}
if (isset($_GET["nomefile"])) 
{
	getfile($_GET["nomefile"]); 
	exit;
}
// Qui fai quel cavolo che vuoi.
print ("<img src='quellochevuoi.php?nomefile=mio.jpg'>");
?>
La funzione getfile invia al buffer di output uno stream di dati binari
contenente l'immagine.
Una pagina HTML e' fatta di HTML, l'esempio che hai protato tu avrebbe
restituito una pagina HTML con in mezzo uno stream binario. L'HTML e
l'HTTP non funzionanto cosi'.
Ad ogni richiesta (quasi) HTTP viene restituito un file. I tag IMG
dell'HTML dicono al browser di richiedere un altro file al server, e
non di leggere lo stream dell'attributo src e di renderizzarlo come
immagine. Oltre a questo c'e' da tener conto degli header content-type
etc.
Con l'escamotage di cui sopra si puo' fare quello che chiedi, in modo
limitato.


 funzione).
certamente, è giusto che sia così.
nel primo caso il file processato dal php e inviato al client diventa:
<img src="<codice binario dell'immagine>">
mentre in SRC devi mettere il percorso dello stream binario che 
rappresenta l'immagine (un URL).
questo perchè quando il tuo browser trova <IMG SRC="xyz.abc">
fa un'altra richiesta al server per il file "xyz.abc".
ora se xyz.abc è un file immagine "miaimmagine.jpg" il tuo web server
spedisce in automatico l'header
content-type: image/jpeg
<output binario di miaimmagine.jpg>
mentre se trova un file .php lo da in pasto al modulo .php
che imposterà l'header con l'istruzione apposita e sputa fuori lo stram 
binario preso dal database.
quindi in fin dei conti quello che vuoi fare tu non è possibile perchè 
il codice HTML e lo stream binario dell'immagine devono essere 
interpretati diversamente dal browser (ovvero avere 2 content-type 
differenti).
spero sia comprensibile quello che ho scritto.
ciao

limitato.
Perchè in modo limitato?
Grazie..
Mhaxx

 Perchè in modo limitato?
Perche' e' un metodo sporco, deve essere gestito con criterio onde
evitare che prima o dopo l'invio in output dello stream binario venga
inviato altro non conforme.
