2012-06-19 4 views
6

Estoy intentando tp obtener PhantomJS servidor web funciona para míno puede entregar los archivos de imagen a través PhantomJS servidor web

Quiero servir 2 archivos, archivo HTML y un archivo de imagen PNG, el archivo html se sirve bien y procesan correctamente en el navegador, pero el archivo png no es

este es el código para el servidor

var fs = require('fs'); 
function loadFile(name){ 
if(fs.exists(name)){ 
    console.log(name+ " File exist"); 
    return fs.open(name,"r"); 
}else { 
    console.log("File do not exist"); 
} 
} 
var server, service; 

server = require('webserver').create(); 

service = server.listen(8080, function (request, response) {  

if(request.url.split(".")[1] === "html"){ 
    var fi = loadFile("./test.html"); 
    response.statusCode = 200; 
    response.write(fi.read()); 
    fi.close(); 
    response.close(); 
}else if (request.url.split(".")[1] === "png"){ 
    var fi = loadFile("./output_87.png"); 
    response.headers = {"Content-Type":"image/png"}; 
    response.statusCode = 200; 
    response.write(fi.read()); 
    fi.close(); 
    response.close(); 
} 
}); 

y este es el archivo html marcado

<html> 
<head><title>title</title></head> 
<body><h1> Hello world </h1> 
    <img src="output_87.png" alt="image"> 
</body> 
</html> 

durante la visualización de este archivo en el navegador, el archivo png no se representa, y aunque he intentado apuntar el navegador para el archivo PNG, que no la hace

he comprobado con las herramientas para desarrolladores de Chrome la red estado y confirma que el archivo está completamente descargado por el navegador

¿Qué pasa?

por cierto, tengo que utilizar PhantomJS, por favor, no me diga d utilizar otro servidor

gracias

Joe

+1

que he acabo de enviar un PR en PhantomJS repositorio para solucionar este problema https://github.com/ariya/phantomjs/pull/288/files (el código probablemente sea malo, pero me funciona) – NiKo

Respuesta

-2

Estás intentando utilizar funciones asíncronas como si fueran síncrona . Todas las funciones del sistema de archivos que está utilizando (exists(), open() y read()) son asíncronas e intentan llamar a una devolución de llamada (que no está suministrando) con el resultado deseado; no lo hacen return. Utilice las versiones de sincronización de esas funciones o (mucho mejor) aprenda a usar E/S asíncronas.

+0

No hay nada asincrónico en el código de ejemplo. Esta es la secuencia de comandos PhantomJS y Node.js! –

2

Creo que su llamada fs.open() debería usar "rb" para el modo de lectura binaria si está leyendo un archivo PNG. El modo "r" funciona para su html porque es texto, pero mientras lee el archivo PNG y lo envía al navegador, los datos de la imagen no se pueden mostrar.

7

Esto funciona para mí (suponiendo que tiene el objeto de respuesta):

var fs = require("fs"); 
    var image = fs.open("image.png", "rb"); 
    var data = image.read(); 
    image.close(); 
    response.setHeader("Content-Type", "image/png"); 
    response.setEncoding("binary"); 
    response.write(data); 
    response.close(); 
+0

Hola querido, gracias por tu participación, esta es una pregunta de hace 3 años, puede funcionar para la versión de hoy ... ¿Cuál es la versión de Phantomjs que usaste? – Joseph

+0

Buen punto, estoy usando PhantomJS v2.1.1 – CarelZA

Cuestiones relacionadas