2016-05-09 13 views
3

ファイルをチャンク内でデータベースに保存しようとしていますが、FileReader.readAsArrayBuffer()を使用してonloadイベントをトリガーしています。 onloadイベントに入ったら、私の問題が発生します。「this」のスコープには、FileReaderプロパティのみが含まれ、クラスからは何もありません。 onloadイベントの直前に定義された変数でさえアクセスできません。私は、私が関数、サービス、変数にアクセスできるようにするために、 'this'の値をパラメータとして渡すように試みることができると考えていましたが、今までのところ成功していませんでした。誰かが似たようなことをしようとしたことがありますか?FileReaderがコントローラのスコープ内でオンロードされていません2

は、ここに私のコンポーネントクラスがthisの範囲を保持する

export class UploadComponent { 
title = 'Upload File'; 
fileData = null; 
files = null; 
fs; 
@Input() 
showUpload: boolean; 

constructor(fileService: FileService) { 
    this.fs = fileService; 
} 

uploadFile() { 
    let temp = document.getElementById("fileToUpload"); 
    let fr = new FileReader(); 
    let file = temp.files[0]; 
    let fb = fr.readAsArrayBuffer(file); 

    fr.onload = function(data) { 
     this.fs.beginFileUpload(file.name, function(data) { 
      let chunkSize = 200000; 
      let startIndex = 0; 
      let stopIndex = chunkSize; 
      let file = data.target.result; 
      let fileChunk = null; 

      while (startIndex < file.length) { 
       if (stopIndex < length) { 
        fileChunk = file.subArray(startIndex, stopIndex); 
        startIndex = stopIndex; 
        stopIndex += chunkSize; 
       } 
       else { 
        fileChunk = file.subArray(startIndex); 
        startIndex = stopIndex; 
       } 
       //fs.uploadChunk(fileChunk); 
      } 
     }); 

    } 

} 

}

私のコンポーネントテンプレート

<input type="file" [(value)]="fileData" [(files)]="files" id="fileToUpload" /> 
<input type="button" (click)="uploadFile()" value="Upload File" /> 

答えて

5

代わりfunction()の使用() =>だ任意のヘルプ

いただき、ありがとうございます

uploadFile() { 
    let temp = document.getElementById("fileToUpload"); 
    let fr = new FileReader(); 
    let file = temp.files[0]; 
    let fb = fr.readAsArrayBuffer(file); 

    fr.onload = (data) => { 
     this.fs.beginFileUpload(file.name, (data) => { 
      let chunkSize = 200000; 
      let startIndex = 0; 
      let stopIndex = chunkSize; 
      let file = data.target.result; 
      let fileChunk = null; 

      while (startIndex < file.length) { 
       if (stopIndex < length) { 
        fileChunk = file.subArray(startIndex, stopIndex); 
        startIndex = stopIndex; 
        stopIndex += chunkSize; 
       } 
       else { 
        fileChunk = file.subArray(startIndex); 
        startIndex = stopIndex; 
       } 
       //fs.uploadChunk(fileChunk); 
      } 
     }); 

    } 
} 

が働いhttps://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Functions/Arrow_functions

+0

は、そんなにありがとうも参照してください!そのような単純な解決策です。リンクのおかげで、私はいくつかのより多くの学習があります。時間制限が上がったら、私はそれを返答としてマークします。 – user2592413

関連する問題