2013-07-15 2 views
0

Я пытаюсь изучить все узлы узла. Я знаю, что вы можете служить файлу с фреймворком, но я пытаюсь сделать это вручную. У меня есть файл jpeg в './public/logo.jpg'. Когда я отправляю запрос через localhost: 8080, я не получаю изображение, просто пустой экран с образцом общего изображения. Что я делаю не так? Благодаря!Подавать файл jpeg в узле без рамки

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

// creates a new httpServer instance 
http.createServer(function (req, res) { 
// this is the callback, or request handler for the httpServer 
log('in server callback') 
res.ins=res.write; 

var parse=url.parse(req.url,true); 
var path0=parse.pathname; 
console.log(path0) 
// respond to the browser, write some headers so the 
// browser knows what type of content we are sending 

var serveFile=function(){ 
    var path='./public'+path0 
    fs.exists(path,function(e){ 
     if(e){ 
      log('serving file') 
      log(path) 
      fs.readFile(path,'binary',function(err,data){ 
       if(data){ 
        res.writeHead(200, {'Content-Type': 'image/jpeg'}); 
        res.ins(data) 
        res.end() 
       } 
      }) 
     } 
     else{ 
      log('no file to serve') 
      log(path) 
      servePage() 
     } 
    }) 
} 
serveFile() 
}).listen(8080); // the server will listen on port 8080 
+0

Возможный дубликат [Основной статический файловый сервер в NodeJS] (http://stackoverflow.com/questions/7268033/basic-static-file-server-in-nodejs) – moka

+0

Пока Я меняю кодировку на «utf8» и изменяю mime, указанный выше код работает для файлов css и js-файлов, а не для файлов изображений. Ссылка, которую вы дали, использует «createFileStream» в отличие от «readFile». Есть ли что-то о изображениях, которые несовместимы с «readFile»? Спасибо – gloo

+1

Когда вы используете readFile, он будет загружать весь файл в память перед отправкой по сети. Но если вы используете поток с каналом, он будет просто «транслировать» поток в сеть и напрямую выводить IO из файла в поток сокетов, что намного эффективнее, особенно для больших файлов. При высокой нагрузке и readFile ваш сервер не сможет обрабатывать слишком много файлов из-за пределов RAM. Хотя это не тот случай с потоками. – moka

ответ

0

Просто измените следующие две строки в readFile обратного вызова:

res.writeHead(200, {'Content-Type': 'image/jpeg'}); 
res.write(data, 'binary'); 

Использование response.write для отправки данных клиенту и установить кодировку для binary. (По умолчанию utf-8)

Смежные вопросы