2017-09-14 17 views
1

にファイルの配列を渡すしようとすると、私はボタンイベントを提出で非常にのようなメソッドを呼び出す:流星方法

'submit #form': function(event, tmpl){ 
    var files = null; 
    if(event.target.fileInput) 
     files = event.target.fileInput.files; 

    console.log(f); 

    Meteor.call('insertFiles', files, function(err){ 
     if(err) 
     { 
      console.log(err); 
     } 
     else 
     { 
      console.log('insertFiles returned.'); 
      Router.go('next_screen'); 
     } 
    }); 
} 

fileInput

<input type="file" name="fileInput" id="fileInput" 
     accept="image/jpeg, image/png, application/pdf" multiple/> 

私の方法:

'insertFiles'(files){ 

    console.log(files); 

    //Rest of code. 
} 

クライアントコンソールのログには、次のようなファイルがあります。

FileList {0: File, 1: File, length: 2} 

しかし、メソッド内で、コンソールログを出力する:

{ '0': {}, '1': {} } 

だから、私は、メソッド内のファイルが表示されません。どうしてこれなの?メソッド内でファイルリストを取得するにはどうすればよいですか?

+0

私は[このチュートリアル](https://coderwall.com/p/7tpa8w/file-upload-with-mete-method)が助けてくれると思います – Kai

+0

@Kai:私はそうは思わない。オブジェクト自体はMeteorメソッドの中に入っています。 – nakiya

答えて

3

FileListまたはFileのいずれかの変数をDDPを通じて流行方式に渡すことはできません。

最も簡単な方法は、FileReaderを使用してファイルの内容をバイナリ文字列として読み込み、サーバーメソッドに渡してファイルシステムまたはDBに保存する方法です。

クライアント側:

'submit #form': function(event, tmpl){ 
    event.preventDefault(); 

    const fileInput = document.querySelector('#fileInput'); 
    const files = _.toArray(fileInput.files); 

    let cnt = files.length; 
    if (!cnt) { 
    return; 
    } 

    const filesArray = []; 
    const addFile = (fileObject) => { 
    if (fileObject != null) { 
     files.push(fileObject); 
    } 
    if(!(--cnt)) { 
     Meteor.call('insertFiles', filesArray, function(err, res){ 
     ... 
     }); 
    } 
    }; 

    _.each(files, (file) => { 
    const reader = new FileReader(); 
    const name = file.name; 
    const type = file.type; 
    reader.onload = (ev) => { 
     addFile({ 
     name, type, 
     content: ev.target.result 
     }); 
    }; 
    reader.onerror =() => { 
     addFile(null); 
    }; 
    reader.readAsBinaryString(file); 
    }); 
} 

それとも、あなたは、例えばCollectionFSなどのアップロード/保存するファイルのお手伝いをするために設計された数多くのパッケージ、のいずれかを使用することができます。

+0

私はこのエラーを受け取ります: 'FileReader'の 'readAsBinaryString':パラメータ1は 'reader.readAsBinaryString(file)'行の 'Blob'タイプではありません。 – nakiya

+0

@nakiya申し訳ありませんが、エラーがありました。修正しました。 – Styx