一种使用javascript访问文件而不使用Node的方法

时间:2018-01-30 02:21:40

标签: javascript jquery html node.js

所以,我想在我的服务器上访问名为music的文件中的所有mp3。然后我想把它们放在一个列表中,让用户播放歌曲。我可以使用Node做到这一点,但我希望能够在我的服务器上运行服务器的情况下做到这一点。因此,我想在不使用Node的情况下执行此操作,而是使用我已经运行的java脚本。我知道我可以使用

访问一个文件
$.get('music/filename.mp3', function(data){
    //var music =  $('item', data);
    console.log(data);
});

但是当我说

$.get('music/*.mp3', function(data){
    //var music =  $('item', data);
    console.log(data);
});

它没有用。有谁知道怎么做?

为了报复,这就是我目前正在做的事情。

router.get('/getMusic', function(req, res, next) {
  fs.readdir('./public/music/', function(err, files) {
    if (err) throw err;

    console.log('Sent result: ' + files);
    res.status(200).json(files);
  })
});

的javascript

$.getJSON('/getMusic', function(json) {
  var options = '<option value=""></option>';
  $.each(json, function(i, item) {
    options += '<option value="' + item + '">' + item + '</option>';
  });
  $('#songs').html(options);
})
.done(function() { console.log('getMusic getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) {
  console.log('getMusic getJSON request failed! ' + textStatus);
  console.log('incoming ' + jqXHR.responseText);
})
.always(function() { console.log('getMusic getJSON request ended!');
});

2 个答案:

答案 0 :(得分:0)

来自浏览器的JavaScript(我假设您的意思是使用不带节点的JavaScript)无法以与Node不同的方式访问您的文件系统。

特别是,它无法在fs.readdir()路由中执行/getMusic次呼叫。为此,您必须拥有Node或其他服务器。

如果您的底层(非节点)服务器(可能是nginx或Apache)配置为搜索music目录的目录列表,则可以读取它,解析它,然后将其用于音乐列表。虽然,这可能有点乱。

至于实际下载音乐,你不能做通配符。您必须直接遍历每个文件,就像您在第一个文件中一样:$.get('music/some-file.mp3')

答案 1 :(得分:0)

某处,已有一台服务器响应:

$.get('music/filename.mp3?ext=mp3', ...)

您需要修改该服务器,使其支持指定所需通配符搜索的其他URL。其他URL可以是查询参数,也可以是指定要查找的通配符的路径,然后返回所需的数据:

您没有显示已经支持$.get('music/filename.mp3',的服务器端代码,但这是您开始的地方。创建一个新路由,接受通配符作为参数(作为查询字符串或请求路径的一部分),然后在该路由中实现通配符行为以返回客户端所需的数据。

例如,您可以在/ getMusic路由上创建一个可选的查询参数,以允许您指定扩展名:

/* -----------------------------------------------------------
/getMusic gets all music files in the public music directory
/getMusic?ext=mp3 gets only music files with that extension
----------------------------------------------------------- */
router.get('/getMusic', function(req, res, next) {
  fs.readdir('./public/music/', function(err, files) {
    if (err) {
       res.status(500).send("fs.readdir() error");
       return;
    }

    if (req.query.ext) {
        // filter files to see if they match the extension in the query parameter
        files = files.filter(function(f) {
            return f.slice(-req.query.ext.length) === req.query.ext;
        });
    }
    console.log('Sent result: ' + files);
    res.status(200).json(files);
  })
});