Загрузка файлов в Webapp в Docker-контейнер - PullRequest
0 голосов
/ 06 ноября 2019

Я постоянно гуглю и не могу найти ответ на этот вопрос. Приношу свои извинения, если это нубский вопрос, так как я все еще новичок в Docker.

Сценарий:

У меня есть док-приложение с веб-интерфейсом NodeJS. На веб-сайте мне нужно иметь возможность загружать файлы и сохранять путь к ним в базе данных (контейнер базы данных MSSql). Когда я загружаю файлы, используя multiparty на конце узла, он дает ему временный путь к файлам. В Windows это ..... / AppData / Local / Temp / .... В Linux это выглядит как / tmp / ... Затем я использую этот путь в качестве ссылки, чтобы открыть файл с другой страницы. ,В Windows, запуская приложение локально (без dockerizing), я могу получить доступ к файлу (исключая функции безопасности Chrome, которые препятствуют загрузке). Тем не менее, на Linux и Dockerized, нет файла. Я добавлю код загрузки файла внизу.

Я знаю, что контейнеры Docker не взаимодействуют с файловой системой хоста, как обычное веб-приложение. Мой файл не хранится в папке / 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);
    });
});

Когда я загружаю файл, я вижу копию этого шоу вкаталог хоста, как и ожидалось. Однако, когда я щелкаю ссылку на файл на html-странице, используя полный путь / var / opt / tmp / FILENAME, он говорит, что не может получить / var / opt / tmp / FILENAME. Я уверен, что это связано с неправильными разрешениями или href в моем html, но я не уверен. Я очень новичок в веб-разработке.

Как получить ссылку на html-страницу для загрузки этого файла из каталога? Пожалуйста, дайте мне знать, если это выходит за рамки первоначального вопроса, и я сделаю новый.

...