【问题标题】:Displaying image stored in ostrio:files显示存储在 ostrio:files 中的图像
【发布时间】:2018-01-03 01:21:02
【问题描述】:

在 ostrio:files 文档中使用了 findOne 函数,这在我的情况下并不方便,我需要带有参数的 find() 以按用户 ID 等进行过滤。 我使用官方教程中常见的 Meteor React 方法如下:

renderImages(){
    return this.props.images.map((image) => (
        <Pic src={image.link()} />
    ));
}

render() {
...
    return (
        <form>
            <FormGroup controlId="formControlsFile">
                <Media>
                    {this.renderImages()}
                </Media>
...
            </FormGroup>
        </form>);
    }
}

export default createContainer(props => {
    Meteor.subscribe("files.images.all");
    return {
        images: Images.find({name: "1.jpeg"}).fetch(),
    }
}, App);

这里是收藏:

import { Meteor } from 'meteor/meteor';
import { FilesCollection } from 'meteor/ostrio:files';

const Images = new FilesCollection({
    collectionName: 'Images',
    allowClientCode: false, // Disallow remove files from Client
    onBeforeUpload(file) {
...
});

if (Meteor.isServer) {
    Meteor.publish('files.images.all', function () {
        return Images.find().fetch();
    });
}

export default Images;

和图片元素:

import React from 'react';
import {createContainer} from 'meteor/react-meteor-data'

class Pic extends React.Component {
    render() {
        return (
            <img width={64} height={64} src={this.props.src} alt="Image"/>
        );
    }
}

export default createContainer(props => {
    console.log("Image src: " + props.src);
    return {
        src: (props.src ? props.src : "no-image-64x64.jpg"),
    }
}, Pic);

此代码导致以下异常:

I20170727-13:46:02.470(3)? Exception from sub files.images.all id uXo24fBLqH8rsMiDy Error: Publish function returned an array of non-Cursors
I20170727-13:46:02.472(3)?     at [object Object]._.extend._publishHandlerResult (packages/ddp-server/livedata_server.js:1098:20)
I20170727-13:46:02.472(3)?     at [object Object]._.extend._runHandler (packages/ddp-server/livedata_server.js:1060:10)
I20170727-13:46:02.473(3)?     at [object Object]._.extend._startSubscription (packages/ddp-server/livedata_server.js:859:9)
I20170727-13:46:02.473(3)?     at [object Object]._.extend.protocol_handlers.sub (packages/ddp-server/livedata_server.js:625:12)
I20170727-13:46:02.474(3)?     at packages/ddp-server/livedata_server.js:559:43

【问题讨论】:

    标签: file reactjs meteor collections


    【解决方案1】:

    这里有两个重要的两个知道的因素:

    1.返回游标而不是数组

    您的发布函数需要返回一个游标,目前它返回一个数组(通过调用 fetch),它是没有游标的。

    您不需要在发布中获取,而是在客户端获取。该发布仅用于通过给定的过滤器/转换/排序等将客户端集合与服务器集合同步。

    2。您需要从 Mongo.Collection 而不是 FilesCollection 获取数据

    FilesCollection 本身不是集合​​,而是使用 Mongo.Collection。如果你想使用集合中的数据,你需要像这样引用集合:Images.collection.find

    返回光标的示例:

    Meteor.publish('files.images.all', function () {
    
        // find data and return cursor if
        // data exists
        const data = Images.collection.find();
        if (data && data.count() >0)
            return data;
    
        this.ready(); // set ready if no data exists
    });
    

    这同样适用于您的客户:

    export default createContainer(props => {
        Meteor.subscribe("files.images.all");
        return {
            images: Images.collection.find({name: "1.jpeg"}).fetch(),
        }
    }, App);
    

    ostrio:files documentation 上还有更多内容可供阅读

    【讨论】:

    • 一模一样的异常((
    • 哦,是的,我忘了提,您需要从集合中获取数据,而不是从 FilesCollection 实例中获取数据,我会更新我的答案
    • 部分有效:显示“无图像”。如何获取存储的图像本身并将其传递给 的 src?
    • 我认为这将是一个不同的问题,因为 ostrio:files 包采用不同的方法,并且取决于您在后端存储文件的方式(s3 vs. gridFs vs. Filesystem vs. etc .) 可能会有完全不同的答案。如果您遇到困难,您可能会更深入地了解documentation 并在这里提出一个新问题。编辑:也许您只需要将相对路径添加到您的 src 属性,假设您通过服务器的文件系统存储图像并且它们是公开可用的。
    • 文件存储在本地,但 image.link() 不起作用 - 没有这样的功能。图像集合中的对象包含与文件名相关的文件,但文件系统中没有这样的文件。
    猜你喜欢
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 2020-12-10
    • 2011-07-28
    • 1970-01-01
    相关资源
    最近更新 更多