Как автоматически загрузить папку в лазурь?

Теперь у меня есть эта часть кода, которая показывает мне все папки в каталоге.

        var dirPath = path.join("C:\\", 'ILJATEST');
    fs.readdir(dirPath, function (err, files) {
        if (err) {
            return console.log('Unable to scan dir ' + err);
        }
        files.forEach(function (file) {

            console.log(file);
        });
    });

И эта часть, где я могу выбрать файл и загрузить его в хранилище BLOB-объектов Azure, нажав кнопку. (это работает)

        document.getElementById('upload-button').addEventListener('click', () => {
        const file = document.getElementById('fileinput').files[0];
        blobService.createBlockBlobFromBrowserFile('mycontainer',
            file.name,
            file,
            (error, result) => {
                if (error) {
                    // Handle blob error
                } else {
                    console.log('Upload is successful');
                }
            });
    });

Как объединить эти коды во все папки с файлами из C: ILJATEST, загружаемыми автоматически при запуске приложения?


person Duntik    schedule 10.04.2019    source источник
comment
Почему вы смешиваете код на стороне сервера и на стороне клиента?   -  person Gaurav Mantri    schedule 10.04.2019


Ответы (1)


Я вижу, вы использовали Azure Storage JavaScript Client Library for Browsers для автоматической загрузки всех файлов в папка и все ее подпапки в браузере.

Вот мой образец кода, который относится к официальному образцу _2 _, чтобы установить правила CORS и получить токен sas из обозревателя хранилищ Azure, и у меня это работает.

<html>
<head>
<script src="https://dmrelease.blob.core.windows.net/azurestoragejssample/bundle/azure-storage.blob.js"></script>
</head>
<body>
<input type='file' id="files" name="files" multiple webkitdirectory directory />
<script>
// Render via server-side to pass the value of account name and sas token, even container name.
var accountName = '<your storage account>';
var SasToken = '<sas token like sv=2018-03-28&ss=bfqt&srt=sco&sp=rwdl&st=2019-04-11T06%3A48%3A24Z&se=2019-04-12T06%3A48%3A24Z&sig=xxxxxxxxxxxxxxxxxxxx'
var blobUri = 'https://' + accountName + '.blob.core.windows.net';
var blobService = AzureStorage.Blob.createBlobServiceWithSas(blobUri,SasToken);
var containerName = '<your container name>';
document.getElementById("files").addEventListener("change", function(event) {
    var files = event.target.files;
    console.log(files)
    for(var i in files) {
        blobService.createBlockBlobFromBrowserFile(containerName, files[i].webkitRelativePath, files[i], {blockSize : files[i].size}, function(error, result, response) {
            finishedOrError = true;
            if (error) {
                // Upload blob failed
            } else {
                // Upload successfully
            }
        })
    }
});
</script>
</body>
</html>

Примечания:

  1. Здесь я использую file.webkitRelativePath (работает только в Chrome или других браузерах на основе хрома, см. https://developer.mozilla.org/en-US/docs/Web/API/File/webkitRelativePath) вместо file.name, поскольку он включает путь к родительской папке.

  2. В целях безопасности я предлагаю максимально сократить время истечения срока действия токена sas и динамически отображать HTML-страницу для имени учетной записи и токена sas на стороне сервера.

В противном случае вы можете попробовать отправить файлы в хранилище Azure на стороне сервера.

Первая страница index.html:

<form action='/upload' enctype="multipart/form-data" method="POST">
    <input type='file' id="files" name="files" multiple webkitdirectory directory />
    <input type="submit" value="Submit" />
</form>

На стороне сервера с использованием express и multer-azure-storage:

var azure = require('azure-storage');
var accountName = '<your account name>';
var accountKey = '<your account key>';
const express = require('express');
const app = express();
const port = 3000;
var multer  = require('multer');
var MulterAzureStorage = require('multer-azure-storage');
var upload = multer({
    preservePath: true,
  storage: new MulterAzureStorage({
    azureStorageConnectionString: 'DefaultEndpointsProtocol=https;AccountName='+accountName+';AccountKey='+accountKey+';EndpointSuffix=core.windows.net',
    containerName: '<your container name>',
    containerSecurity: 'blob',
    fileName: function(file) {
        return file.originalname; // file.originalname includes parent-folder path name
    }
  })
});
app.use(express.static('public'));
app.post('/upload', upload.any(), function(req, res, next) {
    console.log(req.files);
    res.send('OK');
});

app.listen(port, () => console.log(`Example app listening on port ${port}!`));
person Peter Pan    schedule 11.04.2019
comment
Что использовать вместо названия контейнера? - person Nida Munir; 07.03.2020
comment
Какой пакет npm я бы использовал, если использую службу хранилища Azure в reactjs? - person Nida Munir; 07.03.2020