4

GridFS を使用して Meteor で画像のアップロード機能を作成しようとしていますが、すべてが機能しているように見えますが、ファイルにアクセスできません。

それらが正常にアップロードされたかどうかはわかりませんが、Images および EntriesImages コレクションに情報が正常に取り込まれています。

これが私のコードです:

// 1. Packages
cfs:standard-packages
cfs:gridfs

// --------------------


// 2. Defining the collections + schema (collections folder)
Images = new Mongo.Collection('images');

EntriesImages = new FS.Collection("EntriesImages", {
   stores: [new FS.Store.GridFS('EntriesImages')]
});

ImagesSchema = new SimpleSchema({
    image: {
        type: String,
        label: "Image"
    },
    author: {
        type: String,
        label: "Author",
        autoValue: function(){
            return this.userId
        },
        autoform: {
            type: "hidden"
        }
    }
});
Images.attachSchema(ImagesSchema);

// --------------------

// 3. Publishing the collections (server folder)
Meteor.publish('images', function(){
    return Images.find({author: this.userId});
});
Meteor.publish('EntriesImages', function(){
    return EntriesImages.find();
});
// --------------------


// 4. Subscribe and upload functionality(client folder)
Meteor.subscribe('images');
Meteor.subscribe('EntriesImages');

Template.addImages.helpers({
    images: ()=> {
        return Images.find({});
    }
});

Template.addImages.events({
    'submit .add-images': function(event, template) {
        // get the image from the form
        var file = $('.imageInput').get(0).files[0];

        // check if img was uploaded
        if(file){
            fsFile = new FS.File(file);

            EntriesImages.insert(fsFile, function(err, fileObj){
                // if there is no error we make an insert
                if(!err){
                    var productImage = '/cfs/files/ProductsImages/' + fileObj._id;
                    Images.insert({
                        image: productImage
                    });
                }
            });

        } else {
            console.log('something bad happend');
        }

        return false;
    }
});

このコードを使用すると、予想どおり、イメージ コレクションにエントリが取り込まれます。

// sample entry
{
    "_id": "Qp8Hsgki5G9DT2dGz",
    "image": "/cfs/files/ProductsImages/drbbaj7BKzttzzgZX",
    "author": "TMviRL8otm3ZsddSt"
}

また、cfs.EntriesImages.filerecord にも 1 つのエントリが入力されます。

{
  "_id": "x4Sei5sbnFwDii4HE",
  "original": {
    "name": "dash.png",
    "updatedAt": "2015-12-15T14:32:10.000Z",
    "size": 542121,
    "type": "image/png"
  },
  "uploadedAt": "2016-01-18T13:08:34.914Z",
  "copies": {
    "EntriesImages": {
      "name": "dash.png",
      "type": "image/png",
      "size": 542121,
      "key": "569ce3d2e28bd3035ba03735",
      "updatedAt": "2016-01-18T13:08:34.937Z",
      "createdAt": "2016-01-18T13:08:34.937Z"
    }
  }
}

問題は、データベースに保存されたURLを使用して、画像にアクセスできないことです(存在する場合)。

安全でない自動公開を有効にして試しましたが、まだ機能していません..

4

2 に答える 2

2

サーバー側コードで gridfs コレクションの「ダウンロード」アクションを許可することが重要です。

EntriesImages.allow({    
  download: function(userId, fileObj) {
     return true
 }
});

これがないと、url は機能しません

于 2016-01-19T22:18:56.543 に答える
0

上記のコードを期待どおりに実行することはできませんでしたが、次のガイドに従って画像のアップロードを実行することができました: How to upload files with Meteor JS

于 2016-01-19T07:20:33.080 に答える