2011-09-12 4 views
10

ho una pagina web generato da python che funziona come dovrebbe, usando:immagini di output in HTML usando python

print 'Content-type: text/html\n\n' 
print ""         # blank line, end of headers 
print '<link href="default.css" rel="stylesheet" type="text/css" />' 
print "<html><head>" 

voglio aggiungere le immagini a questa pagina web, ma quando faccio questo:

sys.stdout.write("Content-type: image/png\n\n" + file("11.png","rb").read()) 
print 'Content-type: text/html\n\n' 
print ""         # blank line, end of headers 
print '<link href="default.css" rel="stylesheet" type="text/css" />' 
... 

tutto quello che ottiene è l'immagine, quindi se metto il codice un'immagine sotto il mio colpo di testa html/testo tutto quello che ottiene è il testo dall'immagine, vale a dire:

<Ï#·öÐδÝZºm]¾|‰k×®]žòåËÛ¶ÃgžyFK–,ÑôéÓU½zuIÒ}÷ݧ&MšH’V¯^­?üð¼1±±±zýõ×%IñññÚºu«*W®¬wß}W.—K3gÎÔÌ™ÿw‹Ú””I’¹w¤¥hdÒd½q÷X•Šˆ²m¿þfïÞ½*]º´éÈs;¥¤¤Ø¿ILLÔˆ#rÊ 

Inoltre, se provo:

print "<img src='11.png'>" 

ottengo un'immagine spezzata nel browser, e browing direttamente all'immagine produce un errore interno del server 500, con il mio log di Apache dicendo:

8)Exec format error: exec of './../../11.png' failed Premature end of script headers: 11.png 
+0

Invece di mostrarci le dichiarazioni di stampa, mostraci il file html generato. –

+0

Qual è il layout del file/della directory? Sembra che Apache stia cercando di eseguire 11.png come script CGI. Normalmente si archiviano gli script CGI in '/ cgi-bin' e altre risorse altrove. Per caso li stai mescolando? – Helgi

risposta

34

È possibile utilizzare questo codice per incorporare direttamente l'immagine nel tuo HTML:

data_uri = open('11.png', 'rb').read().encode('base64').replace('\n', '') 
img_tag = '<img src="data:image/png;base64,{0}">'.format(data_uri) 

print(img_tag) 

alternativa per Python < 2.6:

data_uri = open('11.png', 'rb').read().encode('base64').replace('\n', '') 
img_tag = '<img src="data:image/png;base64,%s">' % data_uri 

print(img_tag) 

per Python> 3 Sostituire prima linea da

data_uri = base64.b64encode(open('Graph.png', 'rb').read()).decode('utf-8').replace('\n', '') 
+0

: l'oggetto 'str' non ha attributo 'format' args = ("l'oggetto 'str' non ha attributo 'format'",) message = "L'oggetto 'str' non ha attributo 'format' " – Kilizo

+0

In quale versione di Python sei? Sembra essere qualcosa al di sotto del 2.6 in quanto è stato introdotto str.format (http://docs.python.org/library/stdtypes.html#str.format) Ho aggiunto un altro modo per formattare che dovrebbe funzionare su 2.5 – Glider

+0

Sto usando 2.6.4, il tuo secondo suggerimento ha funzionato, è l'unica soluzione che ha finora, grazie, ti darò il 'tick'! Qualche idea sul perché non posso semplicemente usare "print ''"? – Kilizo

2

È non è possibile combinare HTML e un'immagine nello stesso documento. Utilizza il tag <img> per incorporare immagini nel tuo codice HTML.

+1

La piccola nit (che non penso sia ciò che l'OP aveva in mente in ogni caso) è l'uso di URI di dati per mescolare direttamente i dati di immagine nello stream HTML; esempio dalla pagina wikipedia è 'Red dot' – bgporter

+0

Usando questo, ottengo un 'immagine rotta' nel mio browser, quando sfoglio direttamente l'immagine, ottengo 500 errori interni del server. I miei registri di apache dicono: 8) Errore di formato Exec: exec di './../../11.png' fallito Fine prematura delle intestazioni di script: 11.png – Kilizo

2

Le immagini nelle pagine Web sono in genere una seconda richiesta al server. La stessa pagina HTML non contiene immagini, semplicemente riferimenti a immagini come <img src='the_url_to_the_image'>. Quindi il browser effettua una seconda richiesta al server e ottiene i dati dell'immagine.

L'unica opzione per pubblicare immagini e codice HTML è utilizzare un URL data: nel tag img.

+0

Vedere la mia ultima modifica sopra. Grazie – Kilizo

1

Non puoi semplicemente scaricare i dati delle immagini in HTML.

È necessario avere il file servito e collegarlo ad esso o incorporare l'immagine codificata in base64.