8

我在 Heroku 上使用 node.js (express),其中slug 大小限制为 300MB

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

这样,我的所有资产(图像、视频......)都被上传到 lfs-store(比如 AWS S3)并且 git-lfs 留下一个指针文件(其中可能包含 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?

4

2 回答 2

10

实际上,该pointer文件中不包含任何 url 信息(如您提供的链接或此处所示) - 它只是保留oidblob 的(对象 ID),这只是它的sha256.

oid但是,您可以使用和 lfs api来实现您正在寻找的东西,它允许您oid使用批处理请求下载特定的 s 。

您可以知道用于存储 blob 的端点是什么.git/config,可以从中接受非默认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 的重定向响应也可能包含一些身份验证信息。

检查批处理响应文档以查看响应结构 - 您基本上需要解析相关部分并进行自己的调用以检索 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 重命名为。

于 2016-05-05T06:41:53.180 回答
0

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

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

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

PS:感谢@fundeldman 在他的回答中提供了很好的建议;)

于 2017-01-20T16:17:51.330 回答