代码之家  ›  专栏  ›  技术社区  ›  funkyeah

文件选择器。io与Meteor:如何返回实际资产而不是资产链接

  •  2
  • funkyeah  · 技术社区  · 9 年前

    我正在使用文件选择器。io使用Meteor应用程序,我正在为我的应用程序开发安全性。Filepicker为创建和签署策略提供了支持,但在Meteor的服务器端,我觉得为每个请求文件的用户创建过期策略是过度的。

    我想做的是向用户提供文件的间接链接。服务器通过服务器端路由(铁路由器)拦截此请求,然后服务器通过包含所述文件元数据的Files集合检查用户是否对该文件具有权限。

    正如我现在所知,如果用户有权访问,我会向他们提供一个文件链接,其中包含签名和策略作为该链接的参数。相反,我宁愿只返回图像或文件资产,而不返回任何链接。E、 g.服务器端将通过只有服务器知道的链接访问文件或图像,但服务器将把该文件或图像流式传输到客户端,而不共享到该文件的实际链接。

    预期的代码如下所示,我不知道最后该做什么:

    @route "file",
      path: "/file/:_id"
      where: "server"
      action: ->
        if @request.cookies.meteor_login_token
          user = Meteor.users.findOne( 
               {"services.resume.loginTokens.hashedToken": 
               Accounts._hashLoginToken(@request.cookies.meteor_login_token)}
          )
        if user
          # the files collection has metadata about each file
          # these files are uploaded through filepicker
          # this include file.url which is the actual link 
          file = share.Files.findOne(
             {_id: @params._id, accessibleBy: user._id}
          )
          if not file 
            @response.writeHead(403)
            @response.end()
            return
          else
            #return the file/image from filepicker, 
            #e.g. file.url without actually returning the url
            @response.end()
    

    在我的研究中 stream 可能是解决方案,但我不清楚如何在节点中做到这一点。js光纤,就像Meteor服务器端的情况一样。

    1 回复  |  直到 9 年前
        1
  •  1
  •   Oliver    9 年前

    你可以使用 webapp 要创建HTTP端点,请使用 node's http 从中获取图像 Filepicker 然后将其发送到响应:

    var http = Npm.require('http'),
        url = Npm.require('url');
    
    WebApp.connectHandlers.use('/file', function(req, res, next) {
        // URL format: /file/:_id
        var id = url.parse(req.url, true).path.substr(1); // this is _id
    
        // replace the following parameters with filepicker stuff
        http.request({
            host: 'www.devbattles.com',
            path: '/en/images/upload/1427871558.png'
        }, function(result){
            // here we just pipe the http result
            res.writeHead(200, {
                'Content-Type': result.headers['content-type']
            });
            result.pipe(res);
        }).end();
    });
    

    如果要将此代码(例如)复制到 /server/filepickerPipe.js 然后打开 http://server.com/file/test ,你会看到 this picture .


    作为补充说明:

    有可能通过DDP提供所有这些服务。我还将不得不开始从第三方提供文件,所以我可能会研究它并创建一个包,只通过DDP完成,而不会干扰HTTP端点。然而,这是目前的解决方案。