Meteor android 应用不显示图像

Meteor android app not showing images

我正在使用优秀的 file-collection 软件包,

https://atmospherejs.com/vsivsi/file-collection

将图像存储在我的 Mongo 数据库中。 运行 Android 上的应用程序不显示图像(它们显示为损坏的图像)。在浏览器中完美。

我不认为这个问题是这个包独有的,因为它使用 Mongo 的 gridfs 来存储图像,并提供 URL 来访问它们。

这是 Vaughn 在文档中的注释:

Cordova Android Bug with Meteor 1.2+

Due to a bug in the Cordova Android version that is used with Meteor 1.2, you will need to add the following to your mobile-config.js or you will have problems with this package on Android devices:

App.accessRule("blob:*");

我做了,但没有成功。

我还看到文档引用设置 headers 来处理 CORS 问题,如下所示:

myFiles = new FileCollection('myFiles',
  { resumable: true,    // Enable built-in resumable.js chunked upload support
    http: [             // Define HTTP route
      { method: 'get',  // Enable a GET endpoint
        path: '/:md5',  // this will be at route "/gridfs/myFiles/:md5"
        lookup: function (params, query) {  // uses express style url params
          return { md5: params.md5 };       // a query mapping url to myFiles
        },
        handler: function (req, res, next) {
           if (req.headers && req.headers.origin) {
             res.setHeader('Access-Control-Allow-Origin', 'http://meteor.local'); // For Cordova
             res.setHeader('Access-Control-Allow-Credentials', true);
           }
           next();
        }
      },

但还是没有成功。

查看检查器上的网络选项卡,我什至看不到来自服务器的图像请求,这表明它被 Cordova 代码中的某些东西拒绝了,它甚至没有尝试出去并获取图像。

我已经使用 Vaughn 的演示应用重现了这个问题,我已经分叉并添加了 android 平台,所以如果你愿意尝试和帮助,它已经准备好了。

https://github.com/mikkelking/meteor-file-sample-app

如果你做流星 运行 android-device 它应该 运行 在 Android 上。您将需要注册然后上传图像才能看到问题。在浏览器中它工作正常。

任何帮助将不胜感激,这是我项目的一个障碍。我考虑过的一种选择是将图像移动到 S3 存储桶,我认为这应该可行,但如果可以的话,我想将图像保留在数据库中。

我曾经遇到过与 gridfs 类似的问题。我认为问题的出现是因为图像源是相对源。所以你的图像源来自本地主机。它适用于网络版本,因为浏览器与您的服务器位于同一台机器上,因此本地主机源可以正常工作。但在 android 设备上它不会工作,因为图像不在该设备上提供。

当我遇到这个问题时,我刚刚部署到生产环境并且它在移动设备上工作,因为图像源指向互联网上的 url 而不是相对于设备。这适用于生产,但不适用于开发测试。

当我看到这个问题时,我克隆了你的代码并让它在本地开发的 android 设备上运行。

我做的第一步是将 ROOT_URL 环境变量和移动服务器设置为指向您的本地服务器。当你在本地 运行 meteor 时,你可以 运行 这样的命令来设置这些变量,使用你计算机的本地 ip 地址

export ROOT_URL=http://192.168.1.255:3000 && meteor run android-device --mobile-server=http://192.168.1.255:3000

接下来,在你的 sample.coffee Template.collTest.helpers link 函数中,你需要使用绝对 url 而不是相对 url (这样在你的移动设备上它将查看您的本地服务器而不是本地主机)。要动态获取它以便它在不同的服务器上工作,您可以使用类似这样的东西

Meteor.absoluteUrl(myData.baseURL + "/md5/" + this.md5)

然后我不得不将计算机的 IP 地址 http://192.168.1.255:3000 添加到 sample.jade 文件中的内容安全策略中。

我差点忘了,此时我遇到了 403 forbidden 错误。我更改了 sample.coffee 中的 myData.allow 读取函数,然后返回 true 并且 403 消失了,那里的权限发生了一些事情

之后图像出现在我的 android 设备上。