local fileを取得する。(javascript)

JavaScript

drag & drop や input type=fileなどでブラウザからファイルを扱えますが、file指定をコードから行いたかったので覚書きです。

fetch APIを利用するのが洗練されてて書きやすいのでお勧めです。

drag & drop

ondragoverでpreventDefault()する必要あり。関係なさそうなのに影響します。

const fileReader = new FileReader();
fileReader.onload = (e) => doSomething(e);
const dom = document.getElementById('hoge');

dom.ondragover = e => {
    e.preventDefault();
};

dom.ondrop = e => {
    const files = e.dataTransfer.files;
    fileReader.readAsText(files[0], 'utf-8');
};

function doSomething(e) {
    const lineArr = e.target.result.split('\n');
    ...
}

XMLHttpRequest

オーソドックスなやり方?きっと昔はこう書いてたはず。

const fileReader = new FileReader();
fileReader.onload = (e) => doSomething(e);
const url = `file://C:\test\test.csv`;

function getFileFromUrl(filePathOrUrl) {
    const xhr = new XMLHttpRequest();
    xhr.open('GET', filePathOrUrl);
    xhr.responseType = 'blob';
    xhr.addEventListener('load', () => {
        fileReader.readAsText(xhr.response, 'utf-8');
    });
    xhr.send();
}

getFileFromUrl(url);

fetch API

新しいやり方。イメージ的にはjQueryの$.ajax。
IEでは一切機能しないので注意が必要。

const fileReader = new FileReader();
fileReader.onload = (e) => doSomething(e);
const url = `file://C:\test\test.csv`;

fetch(url)
    .then(response => response.blob())
    .then(data => fileReader.readAsText(data, 'utf-8'));

responseには以下のメソッドが利用できる。

  • arrayBuffer()
  • blob()
  • json()
  • text()
  • formData()
フェッチ API の使用 - Web API | MDN
フェッチAPIは、リクエストやレスポンスといったプロトコルを操作する要素にアクセスするためのJavaScriptインターフェイスです。グローバルのfetch()メソッドも提供しており、簡単で論理的な方法で、非同期にネットワーク越しでリソースを取得することができます。

コメント