2013-02-14 10 views
6

Próbuję nauczyć nodejs i pomyślałem, że najlepszym sposobem, aby to zrobić byłoby spróbować jakiejś rzeczy bez użycia żadnych wyraźnych lub inne moduły non-core. Utknąłem, próbując uzyskać jednocześnie tekst i obraz. Kod Próbuję to:Nodejs: Jak powrócić różne typy zawartości z tej samej odpowiedzi (tekst i obraz)?

var http = require('http'); 
var fs = require('fs'); 

var server = http.createServer(function(request,response) { 

    fs.readFile('my_pic.jpg', function(error, file) { 
     response.writeHead(200, {'content-type':'text/html'}); 
     response.write('<p>hi there!</p>'); 

     response.writeHead(200, {'content-type':'image/jpg'}); 
     response.write(file, 'image'); 

     response.end(); 
    }); 

}); 

var port = process.env.PORT || 8080; 

server.listen(port, function() { 
    console.log('Listening on port ' + port); 
}); 

więc doskonale, co powinno być dostarczane jest:

<html> 
<body> 
<p>hi there</p> 
<img src='my_pic.jpg'/> 
</body> 
</html> 

Ale zamiast tego, nic się nie pojawia.

Próbowałem wstawić response.end() po napisaniu 'hi there', który wyświetla tekst, a potem spróbowałem zamienić miejscami tekst i obraz (w tym nagłówki), które wyświetlały obrazek, ale ja nie potrafię obliczyć, jak wyświetlić oba jednocześnie, jak na prawdziwej stronie internetowej.

Czy możesz wyjaśnić, jak go o wprowadzenie różnych rodzajów treści na tej samej stronie - oni muszą być w różnych odpowiedziach? Coś natknąłem się na kolejne pytanie:

nodejs - How to read and output jpg image?

coś takiego wygląda rozwiązania, ale nie mogę dowiedzieć się, jak zastosować to do mojej sytuacji (nie mam dużego doświadczenia w po stronie serwera rzeczy)

Dziękujemy

EDIT:. dostał pracę od odpowiedzi user568109 za:

var http = require('http'); 
var fs = require('fs'); 


var server = http.createServer(function(request,response) { 
fs.readFile('my_pic.jpg', function(error, file) { 

    var imagedata = new Buffer(file).toString('base64'); 

    response.writeHead(200, {'content-type':'text/html'}); 
    response.write("hi there!<img src='data:my_pic.jpg;base64,"+imagedata+"'/>"); 
    response.end(); 

    }); 

}); 

var port = process.env.PORT || 8080; 

server.listen(port, function() { 
    console.log('Listening on port' + port); 
}); 

Wydaje się to dużo pracy z osadzania obrazów chociaż - gdybym chciał umieścić więcej niż jeden obraz w, będę musiał po prostu zachować gniazdowania tych FILESTREAM wywołania zwrotne?

Próbowałem też to w ten sposób, ale to nie działa:

var http = require('http'); 
var fs = require('fs'); 

var server = http.createServer(function(request,response) { 

    response.writeHead(200, {'content-type':'text/html'}); 
    response.write("hi there!<img src='my_pic.jpg'/>"); 
    response.end(); 

}); 

var port = process.env.PORT || 8080; 

server.listen(port, function() { 
    console.log('Listening on port' + port); 
}); 

nie byłem pewien, czy to, co ludzie na myśli linię

response.write('<img src="my_pic.jpg"/>') 

, ponieważ serwer nie robi Wygląda na to, że w moim imieniu prosi o kolejną prośbę o pobranie obrazu? Po prostu pokazuje zepsuty obraz ikony.

+1

Wygląda na to, że próbujesz wtłoczyć 2 żądania HTTP w jedną odpowiedź. Naprawdę powinieneś po prostu napisać 'response.write ('');', a następnie przeglądarka najpierw pobierze kod HTML, a następnie wyśle ​​osobną prośbę o pobranie my_pic.jpg – codefactor

+0

Wygląda na to, że chcesz wysłać odpowiedź wieloczęściową - jak dziwne . Nie wiem, czy jakakolwiek przeglądarka poradzi sobie z tym. Odpowiedź musi być przeanalizowana po stronie klienta, jak sądzę. – MaxArt

+0

możliwy duplikat [Zbuduj wieloczęściową odpowiedź http przy użyciu pliku node.js] (http://stackoverflow.com/questions/11494209/construct-multi-part-http-response-using-node-js) – maerics

Odpowiedz

3

Jeśli nie response.write('<img src="my_pic.jpg"/>'); jak wspomniano powyżej pliku obrazu zostanie wysłana tylko wtedy, gdy przeglądarka wysyła GET dla obrazu. Będzie to żądanie wieloczęściowe.

Albo możesz to zrobić tak. Możliwe jest przesłanie obrazu w postaci binarnej w HTML. Użyj:

<img src="data:image/gif;base64,imagedata"> 

gdzie imagedata to kodowanie base64 obrazu gif. Więc to zrobić w node.js:

//Write text in response. 
content = get-image-file-contents;  //store image into content 
imagedata = new Buffer(content).toString('base64'); //encode to base64 
response.write('<img src="data:image/gif;base64,'+imagedata+'">');//send image 
response.end(); 

sprawdzanie poprawności konwersji obrazu NodeJS base64 image encoding/decoding not quite working

Ten wysyła jedną odpowiedź, która wysyła tekst i obraz. Tylko jeden nagłówek jest wymagany do udzielenia odpowiedzi response.writeHead(200, {'content-type':'text/html'});

+0

Witam user568109, I załadowałem obraz, używając drugiej metody, i zmodyfikowaliśmy moje pytanie, aby uwzględnić ten kod. Jednak nie jestem pewien, jak uzyskać pierwszą metodę do pracy - uwzględniłem również kod w moim edytowanym pytaniu, czy to było to, co miałeś na myśli z linią response.write ('') ;? Wielkie dzięki. – xdl

+0

Po pierwsze był tylko przykład, jeśli chcesz go użyć na stronie HTML. W ten sposób umieszczam obraz na stronie HTML. Latter był kodem JavaScript, którego można użyć w węźle. – user568109

1

Można pisać tylko jedną wartość dla danego nagłówka, więc drugi nagłówek jest nadpisanie pierwszego. Dwa rozwiązania są

  1. wypisać url do obrazka w HTML - będzie nieco wolniejsze dla użytkownika (wymagałoby dodatkowego żądania http w celu pobrania obrazu), ale w zależności od przypadku użycia jest to zwykle dopuszczalne i bardzo prosty w implementacji
  2. przekształcić obraz na ciąg danych uri i umieścić go w html jako źródło obrazu. Bardziej skomplikowana do wdrożenia niż w pierwszym podejściu (nie znam żadnej biblioteki za robienie konwersji w węźle) oraz z niewielkich korzyści.
Powiązane problemy