在Elm中,如何访问本地驱动器上的文件?
例如,我需要访问该文件:
c:\MyFolder\somefile.txt
答案 0 :(得分:2)
(我假设你的目标是浏览器,而不是Node。如果你想要Node支持,here是它的fs
模块的文档。高级用法将类似于我在下面对浏览器的描述。)
还没有(仅)Elm-only API,因此您必须使用端口。 This article非常有用,我会调整其示例。
简而言之,您必须使用File
和FileReader
API(caniuse.com),并在加载文件时通过端口将数据发送到Elm。 (在下面的示例中,Elm会针对提交的每个文件收到GetFile {name : String, content : String}
条消息。)Here is a working example in Ellie.
<强>信息:强>
type Msg
= GetFile File
type alias File =
{ name : String
, content : String
}
端口:强>
port getFile : (File -> msg) -> Sub msg
(不要忘记port module
代替module
在Elm来源之上)
<强>订阅:强>
subscriptions : Model -> Sub Msg
subscriptions model =
getFile GetFile
HTML文件输入:
<input type="file" id="files" name="files[]" multiple />
JS(主要部分!):
<script>
var app = Elm.Main.fullscreen();
function handleFileSelect(evt) {
var files = evt.target.files;
for (var i = 0, f; f = files[i]; i++) {
if (!f.type.match('image.*')) {
continue;
}
var reader = new FileReader();
reader.onload = (function(theFile) {
return function(e) {
app.ports.getFile.send({name: theFile.name, content: e.target.result});
};
})(f);
reader.readAsDataURL(f);
}
}
document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>
编辑:此示例仅接受图片。如果您不想这样,请删除
if (!f.type.match('image.*')) {
continue;
}
部分并在viewFile
函数中执行不同的操作(即,不要尝试将content
数据解释为图像src
)。
答案 1 :(得分:1)
Elm现在可以打开0.19以上的文件。
步骤如下:
请参阅this thread on Elm discourse,其中包括this example on Ellie app