Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 将Webapp上的文件上载到Docker容器_Html_Node.js_Sql Server_Docker_Multiparty - Fatal编程技术网

Html 将Webapp上的文件上载到Docker容器

Html 将Webapp上的文件上载到Docker容器,html,node.js,sql-server,docker,multiparty,Html,Node.js,Sql Server,Docker,Multiparty,我一直在谷歌上搜索,似乎找不到答案。如果这是一个noob问题,我很抱歉,因为我对Docker还是非常陌生的 情景: 我有一个带有NodeJS后端的停靠web应用程序。在网站上,我需要能够上传文件,并将其路径存储在数据库(MSSql数据库容器)中。当我在节点端使用multiparty上传文件时,它会为它提供文件的临时路径。在Windows上,其../AppData/Local/Temp/。。。。在Linux上,它看起来是/tmp/。。。然后,我使用此路径作为链接,从其他页面打开文件。在Window

我一直在谷歌上搜索,似乎找不到答案。如果这是一个noob问题,我很抱歉,因为我对Docker还是非常陌生的

情景:

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

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

我的困惑在于如何存储这些文件。卷似乎是用于将文件加载到容器中的,而存储驱动程序除了配置它们之外,似乎并不是什么可以处理的事情(如果有必要的话,我使用的是Overly2)。如何将上载的文件存储在容器中,以便存储它们的路径并在以后再次访问它们

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页面上的链接以从目录下载此文件?如果这超出了原始问题的范围,请告诉我,我将重新提出一个问题。

浏览器如何将文件取回;是否有相应的
GET/api/files/{id}
路由?主机和容器有单独的文件系统,您不能直接从另一个文件系统访问它们(没有绑定挂载)。@DavidMaze是的,我有一个app.get方法可以从数据库中提取文件名和文件路径。绑定挂载是如何工作的?我见过上面提到的,但不太理解。绑定挂载会将主机可用的文件系统映射到容器中的一个文件夹。在大多数单主机环境中,它们只是将主机上的一个目录装载到容器中,这样写入该目录的任何内容都会保留到主机上。当您进入多主机群时,您可能希望查看NFS或其他分布式装载点。@Dockstar谢谢。你能解释一下卷和绑定挂载之间的区别吗?它们在功能上基本相同,但它涉及到了新版本API的语义。定义卷:
-v:
时,您正在定义绑定装载。然而,在docker compose或swarm堆栈定义中,它要明确得多。如果您转到并搜索“和为单个服务定义的绑定装载”,它们旁边会有一个定义;是否有相应的
GET/api/files/{id}
路由?主机和容器有单独的文件系统,您不能直接从另一个文件系统访问它们(没有绑定挂载)。@DavidMaze是的,我有一个app.get方法可以从数据库中提取文件名和文件路径。绑定挂载是如何工作的?我见过上面提到的,但不太理解。绑定挂载会将主机可用的文件系统映射到容器中的一个文件夹。在大多数单主机环境中,它们只是将主机上的一个目录装载到容器中,这样写入该目录的任何内容都会保留到主机上。当您进入多主机群时,您可能希望查看NFS或其他分布式装载点。@Dockstar谢谢。你能解释一下卷和绑定挂载之间的区别吗?它们在功能上基本相同,但它涉及到了新版本API的语义。定义卷:
-v:
时,您正在定义绑定装载。然而,在docker compose或swarm堆栈定义中,它要明确得多。如果您转到并搜索“和一个为单个服务定义的绑定装载”,它们旁边会有一个定义。