从express'公用文件夹提供git-lfs文件

abe*_*ier 8 heroku amazon-s3 express git-lfs

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

为了保持我的slug小,我想使用git-lfs来跟踪我的快递' public文件夹.

以这种方式,我的所有资产(图像,视频......)都被上传到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);
  });
});
Run Code Online (Sandbox Code Playgroud)

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

dan*_*anf 10

实际上该pointer文件中不包含任何url信息(可以在你提供的链接中看到,或者在这里) - 它只保留oidblob 的(对象ID)sha256.

但是,您可以使用允许您使用批处理请求下载特定s oid的lfs api来实现您正在寻找的内容.oid

您可以知道用于存储Blob的端点是什么.git/config,可以接受非默认lfsurl标记,例如:

[remote "origin"]
   url = https://...
   fetch = +refs/heads/*:refs/remotes/origin/*
   lfsurl = "https://..."
Run Code Online (Sandbox Code Playgroud)

或单独的

[lfs]
   url = "https://..."
Run Code Online (Sandbox Code Playgroud)

如果没有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
Run Code Online (Sandbox Code Playgroud)

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

检查批处理响应文档以查看响应结构 - 您基本上需要解析相关部分并自己调用以检索blob(这是git lfs在结账时您将做的事情).

典型的响应(取自我引用的文档)看起来像:

{
   "_links": {
     "download": {
       "href": "https://storage-server.com/OID",
       "header": {
         "Authorization": "Basic ...",
       }
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

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


abe*_*ier 0

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

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

请参阅此处的用法: https: //github.com/goodenough/express-lfs#usage

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