CollectionFS
カテゴリー:Meteor 作成日:2015年2月3日21:57
CollectionFSの使い方
最初にお断り、自分は英語わかりません。
説明を機械翻訳してよんだので、間違っているかも知れません。
プロジェクトの作成
meteor create testCollectionFS
cd testCollectionFS
いつものようにパッケージを読み込みます。
meteor add cfs:standard-packages meteor add cfs:filesystem
画像を縮小する場合は meteor add cfs:graphicsmagick
testCoolectionFS.html
<head>
<title>testCollectionFS</title>
<head>
<body>
<h1>testCollectionFS Test</h1>
{{> myForm}}
</body>
<template name="myForm">
<input type="file" class="myFileInput" name="files[]" multiple />
<template>
testCollection.js 画像関係の場合。
1 var Images = new FS.Collection("images", 2 stores: [ 3 new FS.Store.FileSystem("images"),{path: "~/upload"}, {
// 3の {path: "~/upload"} と書くことによって~/uploadフォルダーに読み込んだ画像が格納されます。
// {path: "~/upload"} を書かないと testCollectionFS/.meteor/local/cfs/files/imagesに保存される。リサイズされた画像は testColletionFS/.meteor/local/cfs/files/thumbsに。 4 new FS.Store.FileSystem("thumbs",{
//4の"thumbs"の後に "thumbs",{path:"~/upload/thumbs"}と書くと
//13 gm(readStream).resize(180).stream('PNG').pipe(writeStream);でリサイズされるはずの画像はリサイズされない(ばぐ?) 5 beforeWrite: function(fileObj) { 6 return { 7 extension: 'png', 8 type: 'image/png' 9 }; 10 },
// 5~10はリサイズすると同時に png画像へ変換する。この時 要13のstream('PNG')とする事。 stream()とすると壊れたpng画像が格納された。 11 transformWrite: function(fileObj, readStream, writeStream) { 12 // Transform the image into a 10x10px thumbnail 13 gm(readStream).resize(180).stream('PNG').pipe(writeStream); 14 }
// gm を使うため GraphicsMagick をインストールしろとあったので ubuntuserver 14.04 LTSでは、sudo apt-get install graphicsmagick をした。 15 })
16 ],
17 filter: { 18 allow: { 19 contentTypes: ['image/*'] //allow only images in this FS.Collection 20 } 21 } 22}); 23if (Meteor.isClient) { 24 // counter starts at 0 25 Template.myForm.events({ 26 'change .myFileInput': function(event, template) { 27 FS.Utility.eachFile(event, function(file) { 28 Images.insert(file, function (err, fileObj) { 29 //Inserted new doc with ID fileObj._id, and kicked off the data upload using HTTP 30 }); 31 }); 32 } 33 }); 34} 35if (Meteor.isServer) { 36 Meteor.startup(function () { 37 // code to run on server at startup 38 }); 39}
テキストファイル関係では
testCollectionFS.html
<input type="file" class="myFileInput" name="files[]" multiple />
を
<input type="file" class="myFileInput" name="files[]" />
と multipleをはずした。
testCollectionFS.js
var eventPhotosStore = new FS.Store.FileSystem('eventPhotos', { path: '~/uploads/full' }); eventPhotos = new FS.Collection('eventPhotos', { stores: [eventPhotosStore] }); events = new Meteor.Collection('events'); if (Meteor.isClient) { Template.myForm.events({ 'change .myFileInput': function(evt) { var file = evt.target.files[0]; var fileObj = eventPhotos.insert(file); console.log('Upload result: ', fileObj); events.insert({ name: file.name, file: fileObj }); }
}
のように使うようだ、
簡単にファイル操作ができるようだが、自分のほしかった機能( ローカルのファイルを読み込んで moongodb へ格納する )ではないようだ。
<input type="file" class="myFileInput" name="files[]" multiple />
で multiple は複数同時にファイルを読み込んでくれるので便利ではあるが、メモリーの関係かハングしたようになる場合があるようだ。