在Javascript中,当在本地工作时,如何从项目文件夹中读取文件并将其用作ArrayBuffer
In Javascript, when working locally, how to read file from project folder to use it as ArrayBuffer?
我正在使用Web音频API开发合成器。现在,我正在努力将混响的脉冲响应加载到arrayBuffer
中,以便在音频上下文中使用它。
当我在本地工作时,我试着像在Ruby项目中一样,简单地从文件系统中读取带有IR的文件(位于与index.html相同的文件夹中,位于audio/IR/irHall.ogg
下)。现在我想明白了,这是不可能的,因为在浏览器中运行Javascript代码时存在安全问题。
所以我尝试了在教程中找到的这种方法
function loadAudio( object, url) {
var request = new XMLHttpRequest();
request.open('GET', url, true);
request.responseType = 'arraybuffer';
request.onload = function() {
context.decodeAudioData(request.response, function(buffer) {
object.buffer = buffer;
});
}
request.send();
}
在我的应用程序中,当我用url = 'audio/IR/irHall.ogg'
调用此函数时,它会给出我这个错误':
dub-machine.js:63 XMLHttpRequest cannot load file:///Users/bla/projects/dub-machine/audio/IR/irHall.ogg. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.`
很抱歉,如果给人的印象是我没有做过很多研究。事实上,我在谷歌上搜索了几个小时的解决方案,并不断感到困惑。
有人能告诉我从项目中加载文件以在javascript上下文中使用其内容的最佳/常用方法是什么吗?
谢谢!
我发现用node设置一个简单的静态http服务器一点也不麻烦,而且非常适合我。我在Sitepoint上学习了Ian Oxley的教程,并以Paperboy为例。
只需创建一个节点文件,例如paperboy-server.js
,并用以下代码填充:
var paperboy = require('paperboy'),
http = require('http'),
path = require('path')
var webroot = "/localpath/to/your/project",
port = 8080
http.createServer(function(req, res){
var ip = req.connection.remoteAddress
paperboy
.deliver(webroot, req, res)
.addHeader('X-Powered-By', 'Atari')
.before(function() {
console.log('Request received for ' + req.url);
})
.after(function(statusCode) {
console.log(statusCode + ' - ' + req.url + ' ' + ip);
})
.error(function(statusCode, msg) {
console.log([statusCode, msg, req.url, ip].join(' '));
res.writeHead(statusCode, { 'Content-Type': 'text/plain' });
res.end('Error [' + statusCode + ']');
})
.otherwise(function(err) {
console.log([404, err, req.url, ip].join(' '));
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('Error 404: File not found');
});
}).listen(port);
console.log('paperboy on his round at http://localhost:' + port);
为了方便起见,我刚刚将webroot
更改为静态指向我工作的目录。
然后,我只需在终端中启动节点脚本:node paperboy-server.js
在浏览器中,我现在可以使用localhost:8080
访问我的应用程序,而不是使用file:///..
从文件系统提供服务,并且如OP中所示加载文件可以很好地工作。
相关文章:
- Javascript:检测文件读取器中是否有图像
- 从多个文件中推送文本的函数(使用html5文件读取器上传)返回数组
- 从d3.js中的文件读取json数据不起作用
- Javascript文件读取器
- 从外部javascript文件读取var并将其转换为php变量
- 在jQuery/JS中将文件读取为字符串
- Chrome应用程序:从服务器上的文件读取和写入数据
- 文件读取器无法在chrome和IE中工作
- 将节点.js对象设置为从文件读取的数据
- Django从通过网站上传的文件读取
- 在文件读取器中追加的订单问题
- 从 JavaScript 中的本地 JSON 文件读取时出错
- 是否有可能使用三个.js文件读取STEP文件
- 将文件读取到 blob 并以 JavaScript 格式显示
- 文件读取器和 Blob 的关闭编译器警告 - 无法修复它
- 使用 knex 从文件读取并插入数据库结束错误
- Corodva 文件读取执行成功和失败回调
- 文件读取器 JS 抛出对象正忙于读取 blob
- 承诺在 NodeJS 中循环和文件读取
- 无法弄清楚 $.get 上的回调以将文本文件读取到数组中