【问题标题】:Serve jpeg file in node without framework在没有框架的节点中提供 jpeg 文件
【发布时间】:2013-07-13 14:30:03
【问题描述】:

我正在尝试学习节点的来龙去脉。我知道您可以使用框架提供文件,但我正在尝试手动完成。我在“./public/logo.jpg”中有一个 jpeg 文件。当我通过 localhost:8080 发送请求时,我没有得到图像,只是一个带有通用图像占位符的空白屏幕。我究竟做错了什么?谢谢!

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

【问题讨论】:

  • 只要我将编码更改为 'utf8' 并更改 mime,上面的代码就适用于 css 文件和 js 文件,但不适用于图像文件。您提供的链接使用“createFileStream”而不是“readFile”。是否存在与“readFile”不兼容的图像?谢谢
  • 当您使用 readFile 时,它​​会将整个文件加载到内存中,然后再通过网络发送。但是如果你使用带管道的流,它只会将流“管道”传输到网络,并直接从文件输出 IO 到套接字流,这对于大文件来说效率更高。在高负载和 readFile 的情况下,由于 RAM 限制,您的服务器将无法处理太多文件。虽然这与流不同。

标签: javascript node.js jpeg


【解决方案1】:

只需在 readFile 回调中更改以下两行:

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

使用response.write向客户端发送数据并将编码设置为binary。 (默认为 utf-8)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多