我如何提供所有类型的图像?

时间:2014-09-04 20:13:38

标签: javascript node.js

我正在尝试在node.js中编写一些代码,这些代码使用url的扩展名来查找图像。例如,如果网址的扩展名为.jpg,则会查找并回复.jpg文件。如果url扩展名为.png或.svg,它将使用正确的文件类型提供相应的文件。

这就是我所拥有的:

var http = require('http');
var path = require('path');
var fs = require('fs');
var server = http.createServer(function(req, res) {


if(path.extname(req.url) == ".png" || path.extname(req.url) == ".gif" || path.extname(req.url) ==    ".svg") {

fs.readFile(path.basename(req.url), function(err, data) {

        var extname = path.extname(req.url);

        switch(extname) {

        case ".png":
            var ext = "image/png";
        case ".svg":
            var ext = "image/svg+xml";
        case ".gif":
            var ext = "image/gif";

            }

    res.writeHead(200, {'content-type':ext});
    res.end(data);
    console.log(ext);

});

}



}); 

server.listen(80);

这让我疯狂,因为当我观察标题时,它没有使用正确的内容类型。我使用switch语句将正确的内容类型放入基于扩展名的变量中。因此,如果扩展名为.png,则会放置" image / png"进入名为 ext 的变量。在' content-type':...

之后,我将变量ext放在writeHead部分中

我是控制台记录变量" ext "而我正在" image / gif"无论。即使extname是.svg或.png。

此时如果我在我的服务器domain.com/picture.svg上查找文件并检查标题,它将显示:content-type:image / gif ..我的switch语句清楚地说明了path.extname (req.url)是" .svg",然后" image / svg + xml"应该放在变量 ext 中。

我尝试了一些奇怪的事情,例如在变量周围加上引号" ext"它实际上显示了我请求的.svg文件。即使标题看起来像这样:content-type:ext。

我很困惑,我需要一些帮助。

我的代码出了什么问题? 如何仅使用node.js中的代码块显示.jpg .png .svg .gif?

没有表达或框架!我正在寻找一个纯node.js解决方案。

1 个答案:

答案 0 :(得分:0)

在您的代码中,您似乎错过了" break"在每个案例中,以及为什么它一直评估到最后一个案例?请阅读以下原因:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/switch

  

示例:如果我忘了休息会怎么样?

     

如果您忘记了休息,那么脚本将从大小写开始运行   满足标准,并在此之后运行案例,无论如何   标准得到满足。

您的代码看起来应该更像:

var extname = path.extname(req.url);
var allowed = [".png", ".gif", ".svg"];
var ext = "";

if (!!~allowed.indexOf(extname)) {
    fs.readFile(path.basename(req.url), function(err, data) {
        switch(extname) {
            case ".png":
                ext = "image/png";
                break;
            case ".svg":
                ext = "image/svg+xml";
                break;
            case ".gif":
                ext = "image/gif";
                break;
        }

        res.writeHead(200, {'content-type':ext});
        res.end(data);
    });
}