2012-06-19 27 views
6

tôi đang cố gắng tp được phantomjs webserver làm việc cho tôiKhông thể cung cấp tập tin hình ảnh thông qua phantomjs webserver

Tôi muốn phục vụ 2 file, file html, và một file ảnh png, file html được phục vụ tốt và trả lại một cách chính xác trong trình duyệt, nhưng các tập tin png không phải là

đây là mã cho server

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(); 
} 
}); 

và đây là đánh dấu tập tin html

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

khi xem tệp này trong trình duyệt, tệp png không được hiển thị và thậm chí nếu tôi cố gắng trỏ trình duyệt tới tệp png, nó không hiển thị nó

tôi đã kiểm tra với công cụ phát triển chrome mạng trạng thái và xác nhận rằng tệp được tải xuống hoàn toàn bởi trình duyệt

điều gì là sai?

bằng cách này, tôi phải sử dụng phantomjs, xin vui lòng d không cho tôi biết để sử dụng máy chủ khác

nhờ

Joe

+1

Tôi vừa mới gửi một PR trên phantomjs kho để khắc phục vấn đề này https://github.com/ariya/phantomjs/pull/288/files (mã có lẽ là crappy, nhưng nó hoạt động cho tôi) – NiKo

Trả lời

-2

Bạn đang cố gắng sử dụng các chức năng không đồng bộ như thể chúng là đồng bộ . Tất cả các chức năng hệ thống tệp bạn đang sử dụng (exists(), open()read()) là không đồng bộ và cố gọi lại gọi lại (mà bạn không cung cấp) với kết quả mong muốn; họ không return nó. Sử dụng các phiên bản đồng bộ hóa của các chức năng đó hoặc (tốt hơn nhiều) để tìm hiểu cách sử dụng I/O không đồng bộ.

+0

Không có gì là không đồng bộ về mã ví dụ. Đây là kịch bản lệnh PhantomJS và Node.js! –

2

Tôi tin rằng lệnh fs.open() của bạn nên sử dụng "rb" cho chế độ đọc nhị phân nếu bạn đang đọc tệp PNG. Chế độ "r" hoạt động cho html của bạn bởi vì đó là văn bản, nhưng trong khi nó vẫn sẽ đọc tệp PNG và phân phối nó cho trình duyệt, dữ liệu hình ảnh không thể hiển thị.

7

này làm việc cho tôi (giả sử bạn có đối tượng response):

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

Xin chào, Cảm ơn sự tham gia của bạn, đây là câu hỏi 3 năm tuổi, nó có thể hoạt động cho phiên bản hiện tại ... phiên bản phantomjs bạn sử dụng là gì? – Joseph

+0

Điểm tốt, tôi đang sử dụng PhantomJS v2.1.1 – CarelZA

Các vấn đề liên quan