2014-09-04 83 views
0

我想在node.js中编写一些代码,它使用url的扩展名来查找图像。例如,如果url的扩展名是.jpg,它将查找并响应.jpg文件。如果网址扩展名为.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的变量中。我将变量ext放在'content-type'后面的writeHead部分中:...

我是控制台日志变量“ext”,无论如何我都会得到“image/gif”。即使extname是.svg或.png。

在这一刻,如果我在我的服务器domain.com/picture.svg上查找文件并检查标题,它将显示:content-type:image/gif ..我的switch语句清楚地说明了路径。 extname(req.url)为“.svg”,则应将“image/svg + xml”放入变量ext

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

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

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

没有明示或框架!我正在寻找一个纯粹的node.js解决方案。

+2

@zvona - 这听起来像一个答案给我。 – adeneo 2014-09-04 20:20:36

+0

@zvona,让你的评论一个答案。 – 2014-09-04 20:26:45

+0

现在一切正常,谢谢。但我有个问题。我是控制台日志记录extnames,基本名称和switch语句生成的变量。 .gif和.png控制台日志没有问题,但.svg从不控制台记录任何东西。即使在标题中,我也可以看到content-type:ext。 Ext是变量。但gif和png正确显示:content-type:image/gif和content-type:image/png。我也在switch语句中添加了中断。 .svg的行为有什么不同? – user3658794 2014-09-04 20:36:08

回答

0

在你的代码中,你似乎缺少每个案例的“休息”,这就是为什么它会评估所有的方式到最后一种情况?请阅读背后的原因: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); 
    }); 
} 
+0

为什么.png和.gif得到===,而.svg只能得到==? – user3658794 2014-09-04 20:44:11

+0

它被称为错字。将修复:)(并重新考虑一些) – zvona 2014-09-04 20:48:37

+0

在if语句的开头做什么!!〜? – user3658794 2014-09-04 22:19:23

相关问题