15KB
公開: 更新:

2025/01/23

日記

 ファイルを取り込むページを作っていた。(まぁChatGPTに頼り切りなのだけれども。)
ChatGPT曰く、ファイルを読み込む時にはArrayBufferで読み込むっぽい(というか今回使おうとしていた関数がArrayBufferを受け取るものだったから使おうとした。)けれども、ArrayBufferにはサイズ制限があるhttps://stackoverflow.com/questions/17823225/do-arraybuffers-have-a-maximum-length, https://bugzilla.mozilla.org/show_bug.cgi?id=1392234ので、これは使えない。
結局streamの形で読み込めるライブラリを借りて、ReadableStreamを使うことで解決した。

 コードとしては、

hoge = await hoge.create();
hoge.init();

const stream = file.stream();
const reader = stream.getReader();
let done = false;

while (!done) {
  const { value, done: streamDone } = await reader.read();
  if (value) {
    hoge.update(value);
  }
  done = streamDone;
}

という感じ。

あと、ドラッグ&ドロップのときにブラウザのデフォルト動作を止めるには、

document.addEventListener('dragover', (event) => {
  event.preventDefault();
});

document.addEventListener('drop', async (event) => {
  event.preventDefault();

  // なにかする。
  // documentを見ているので、ここで処理すれば、ページどこでもドラッグアンドドロップできるようになる。
}

とすれば行けるっぽい。