1

我一直在谷歌搜索,似乎无法找到答案。如果这是一个菜鸟问题,我深表歉意,因为我对 Docker 仍然非常陌生。

设想:

我有一个带有 NodeJS 后端的 dockerized Web 应用程序。在网站上,我需要能够上传文件并将它们的路径存储在数据库(MSSql 数据库容器)中。当我在节点端使用多方上传文件时,它会为其提供文件的临时路径。在 Windows 上,它的 ...../AppData/Local/Temp/.... 在 Linux 上,它看起来是 /tmp/... 然后,我使用此路径作为从不同页面打开文件的链接. 在 Windows 上,在本地运行应用程序(无 dockerizing),我可以访问该文件(不包括阻止下载的 Chrome 安全功能)。但是,在 Linux 和 dockerized 上,没有文件。我将在底部附上我的文件上传代码。

我知道 docker 容器不像普通的 Web 应用程序那样与主机的文件系统通信。我的文件没有存储在 /tmp 文件夹中,因为我已经在那里检查过了。我的猜测是它以某种方式将其存储在容器中。

我的困惑在于如何存储这些文件。卷似乎是用于将文件加载到容器中,而存储驱动程序似乎除了配置它们之外你可以乱用(如果重要的话,我正在使用 overlay2)。如何将上传的文件存储在我的容器中,以便我可以存储它们的路径并稍后再次访问它们?

var app = express();
app.post("/api/files", function(req, res) {
    var form = new multiparty.Form();
    form.parse(req, function(err, fields, files) {
        var dict = files.Contents[0];
        console.log(dict);
        var query = "EXECUTE CTF.dbo.CTF_CreateFilesSp " + fields.ID + ", '" + dict["originalFilename"] + "', '" + dict["path"] + "'";
        executeQuery(query, res);
    });
});

更新: 我能够使用以下方法为我的容器设置卷/绑定挂载:

volumes:
       - /var/opt/tmp:/var/opt/tmp

我将我的解析方法更新为:

app.post("/api/files", function(req, res) {
    var form = new multiparty.Form();
    var target_path = '';

    form.on('file', function(name, file) {
        var tmp_path = file.path;
        target_path = '/var/opt/tmp/' + file.originalFilename;
        fs.copyFile(tmp_path, target_path, function(err) {
            if (err) console.error(err.stack);
            else console.log(target_path);
        })
    });
    form.parse(req, function(err, fields, files) {
        var dict = files.Contents[0];
        var query = "EXECUTE CTF.dbo.CTF_CreateFilesSp " + fields.ID + ", '" + dict["originalFilename"] + "', '" + target_path + "'";
        executeQuery(query, res);
    });
});

当我上传文件时,我确实看到这个副本按预期显示在主机目录中。但是,当我使用完整路径 /var/opt/tmp/FILENAME 单击 html 页面上的文件链接时,它说无法获取 /var/opt/tmp/FILENAME。我确定这与我的 html 中的权限或 href 不正确有关,但我不确定。我对网络开发很陌生。

如何获取 html 页面上的链接以从目录下载此文件?请让我知道这是否超出了原始问题的范围,我会提出一个新问题。

4

0 回答 0