【问题标题】:Serve git-lfs files from express' public folder从 express 的公共文件夹中提供 git-lfs 文件
【发布时间】:2016-08-22 11:49:31
【问题描述】:

我在 Heroku 上使用 node.js (express),其中 slug size is limited to 300MB

为了让我的 slug 保持小,我想使用 git-lfs 来跟踪我的 express'public 文件夹。

这样,我所有的资产(图像、视频...)都会上传到 lfs-store(比如 AWS S3),然后 git-lfs 会留下 a pointer file(可能包含 S3 URL?)。

在从公共文件夹提供文件时,我想快速重定向到远程 S3 文件。

我的问题是我不知道如何从指针文件的内容中检索 URL...

app.use('/public/:pointerfile', function (req, res, next) {
  var file = req.params.pointerfile;
  fs.readFile('public/'+file, function (er, data) {
    if (er) return next(er);

    var url = retrieveUrl(data); // <-- HELP ME HERE with the retrieveUrl function

    res.redirect(url);
  });
});

您不认为快速读取和解析所有public/* 文件不会太昂贵。也许我可以在解析后缓存 URL?

【问题讨论】:

    标签: express heroku amazon-s3 git-lfs


    【解决方案1】:

    实际上 pointer 文件中不包含任何 url 信息(如您提供的链接或 here 所示) - 它只保留 blob 的 oid(Object ID)只是它的sha256

    但是,您可以使用 oid 和 lfs api 来实现您想要的,这使您可以使用 batch request 下载特定的 oids。

    您可以通过.git/config 判断用于存储 blob 的端点是什么,它可以接受非默认的 lfsurl 标签,例如:

    [remote "origin"]
       url = https://...
       fetch = +refs/heads/*:refs/remotes/origin/*
       lfsurl = "https://..."
    

    或单独的

    [lfs]
       url = "https://..."
    

    如果没有 lfsurl 标记,那么您使用的是 GitHub 的端点(可能会重定向到 S3):

    Git remote: https://git-server.com/user/repo.git
    Git LFS endpoint: https://git-server.com/user/repo.git/info/lfs
    
    Git remote: git@git-server.com:user/repo.git
    Git LFS endpoint: https://git-server.com/user/repo.git/info/lfs
    

    但是你应该使用它而不是直接使用 S3,因为 GitHub 的重定向响应也可能包含一些身份验证信息。

    检查batch response 文档以查看响应结构 - 您基本上需要解析相关部分并自己调用以检索 blob(这是git lfs 在结帐时代替您所做的) .

    典型的响应(取自我引用的文档)如下所示:

    {
       "_links": {
         "download": {
           "href": "https://storage-server.com/OID",
           "header": {
             "Authorization": "Basic ...",
           }
         }
      }
    }
    

    所以你可以 GET https://storage-server.com/OID 与从批处理响应返回的任何 headers - 最后一步是重命名返回的 blob(它的名称通常只是 oid 为 git lfs使用基于校验和的存储)- 指针文件具有原始资源的名称,因此只需将 blob 重命名为该名称即可。

    【讨论】:

    • thx @fundeldman,您能否开发更多关于使用批处理 API(没有 github 和授权)获取资源 URL 的请求?非常感谢
    【解决方案2】:

    我终于为此制作了一个中间件:express-lfs,这里有一个演示:https://expresslfs.herokuapp.com

    您可以在那里下载 400Mo 文件作为证明。

    在此处查看用法:https://github.com/goodenough/express-lfs#usage

    PS:感谢@fundeldman 在his answer 中提供的好建议;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 2019-02-07
      • 2023-02-13
      相关资源
      最近更新 更多