Html 将Webapp上的文件上载到Docker容器
我一直在谷歌上搜索,似乎找不到答案。如果这是一个noob问题,我很抱歉,因为我对Docker还是非常陌生的 情景: 我有一个带有NodeJS后端的停靠web应用程序。在网站上,我需要能够上传文件,并将其路径存储在数据库(MSSql数据库容器)中。当我在节点端使用multiparty上传文件时,它会为它提供文件的临时路径。在Windows上,其../AppData/Local/Temp/。。。。在Linux上,它看起来是/tmp/。。。然后,我使用此路径作为链接,从其他页面打开文件。在Windows上,在本地运行应用程序(无停靠),我可以访问该文件(不包括阻止下载的Chrome安全功能)。但是,在Linux和Docked上,没有文件。我将在底部附上我的文件上传代码 我知道docker容器不像普通的web应用程序那样与主机的文件系统通信。我的文件没有存储在/tmp文件夹中,因为我已经在那里进行了检查。我的猜测是,它以某种方式将其存储在容器中 我的困惑在于如何存储这些文件。卷似乎是用于将文件加载到容器中的,而存储驱动程序除了配置它们之外,似乎并不是什么可以处理的事情(如果有必要的话,我使用的是Overly2)。如何将上载的文件存储在容器中,以便存储它们的路径并在以后再次访问它们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
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堆栈定义中,它要明确得多。如果您转到并搜索“和一个为单个服务定义的绑定装载”,它们旁边会有一个定义。