0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

xmlHttpRequestでファイル読み取り

Last updated at Posted at 2019-12-02

#xmlHttpRequestでファイル読み込みを行う
javascriptでどうにかローカルファイルを読み込みたくて、
xmlHttpRequestで実装することにした。以下の点で、困ったので
記録として残しておこうと思います。

下記コードでファイル読み込み実施したが、古いファイル内容が読み込まれる
時が多々あり、困っていた。
原因は頻繁に発生するリクエストはキャッシュに保存され、ファイルが更新
されていてもキャッシュからデータを取得することで古いデータしか取得できなかった。

var rawFile = new XMLHttpRequest();
var allText = "";
rawFile.open("GET", file, true);
rawFile.onreadystatechange = function (){
  if(rawFile.readyState === 4){
     if(rawFile.status === 200){
    allText = rawFile.responseText;
     }else{
        alert("データ取得失敗")
     }
  }
}
rawFile.send(null);

キャッシュからデータを取得しない設定を下記のように実施し、改善できた。

var rawFile = new XMLHttpRequest();
var allText = "";
var file ="xxx.txt"
rawFile.open("GET", file, true); //false:同期通信 true:非同期通信
//以下3行はキャッシュから取得しない設定
rawFile.setRequestHeader('Pragma', 'no-cache');
rawFile.setRequestHeader('Cache-Control', 'no-cache');
rawFile.setRequestHeader('If-Modified-Since', 'Thu, 01 Jun 1970 00:00:00 GMT');
rawFile.onreadystatechange = function (){
  if(rawFile.readyState === 4){
     if(rawFile.status === 200){
    allText = rawFile.responseText; //取得完了時の処理
     }else{
        alert("データ取得失敗")
     }
  }
}
rawFile.send(null); //上記設定でリクエストを送信

問題発生時は、全く原因がわからず、キャッシュというキーワードにたどり着くまで、
長い闘いでした。
原因探索のために、対象のファイルパスを削除してもファイルがリードされ、
何が何やらわからなかった。とりあえず、解決できてよかった。

今回、ついでに勉強になったこと。。。
同期通信で取得すると、データを受信するまで、クライアント側の処理がストップする
ため、非同期で取得するほうがいい。

参照ページ
http://butaryuu.web.fc2.com/httpreq_cache.html

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?