Зашифрованный код на сайте Azure Blob stati c - PullRequest
0 голосов
/ 31 января 2020

Я недавно пытаюсь развернуть свой Angular сайт на Azure Stati c Сайт, но обнаружил некоторые проблемы.

Насколько я могу протестировать, используя ng build и загрузите все файлы в хранилище BLOB-объектов, и сайт работает хорошо, но если я сжимаю свои файлы, чтобы сэкономить больше места, все вещи go неправильные.

Я сжимаю мои файлы с помощью gzip в Linux, а затем переименовываю их, чтобы обрезать. в конце концов.

Поскольку все файлы кодируются как gzip, я использую пакет @ azure / storage-blob для загрузки своих файлов, сценарий в JS выглядит следующим образом:

const fs = require("fs");

const {BlobServiceClient, StorageSharedKeyCredential} = require("@azure/storage-blob");
//Give every file type a content type
const contentTps = {
  "js": "text/javascript",
  "txt": "text/plain",
  "png": "image/png",
  "css": "text/css",
  "json": "application/json",
  "gif": "image/gif",
  "ico": "image/x-icon",
  "svg": "image/svg+xml",
  "woff": "application/font-woff",
  "html": "text/html"
};
//Should perhaps detect the key handly
const account = "accountName";
const accountKey = "accountKey";
const containerName = "$web";
const fileLocation = "./dist/";
// Use StorageSharedKeyCredential with storage account and account key
// StorageSharedKeyCredential is only avaiable in Node.js runtime, not in browsers
let sharedKeyCredential = new StorageSharedKeyCredential(account, accountKey);
let blobServiceClient = new BlobServiceClient(
  `https://${account}.blob.core.windows.net`,
  sharedKeyCredential
);

//This main function could be edited to fit others situations
async function main() {

  //take container by container name
  let container = blobServiceClient.getContainerClient(containerName);

  //Delete all files in container , to upload it again.
  for await (let blob of container.listBlobsFlat()) {
    await container.deleteBlob(blob.name);
  }
  fs.readdirSync(fileLocation).forEach(file => {
    console.log("file is " + file);
    let stat = fs.lstatSync(fileLocation + "/" + file);
    if (stat.isFile()) {
      let txt = fs.readFileSync(fileLocation + "/" + file);
      //test upload function.
      let blobName = file;
      let index = blobName.lastIndexOf(".");
      let ext = blobName.substr(index + 1);
      console.log("The file end with:" + ext);

      console.log("Uploading block blob" + blobName);
      //should edit content type when upload, otherwise they will all become application/octet-stream, and impossible to open in browser
      container.uploadBlockBlob(blobName, txt, txt.length, {
        "blobHTTPHeaders": {
          "blobContentType":contentTps[ext],
          //not for local deploy test"blobContentEncoding":"gzip"
          blobContentEncoding: "gzip",
        }
      });

      //const uploadResponse = blockBlobClient.uploadFile(fileLocation+"/"+file);
      console.log("Blob was uploaded ");
    }
  });

}

main();

Как вы видите, я также изменил тип содержимого на соответствующий, вместо application / octet-stream по умолчанию.

Операция загрузки работает все еще хорошо, но файл в сети просто становится закодированным кодом. .

1 Ответ

0 голосов
/ 27 марта 2020

Сначала вам нужно сжать содержимое. Вот пример

  const content = "Hello world hello world Hello world hello world Hello world hello world";
  const gzipped = zlib.gzipSync(content);
  const res = await blockBlobClient.upload(gzipped, gzipped.byteLength, {
    blobHTTPHeaders: {
        blobContentEncoding: "gzip",
        blobContentType: "text/plain; charset=UTF-8"
    }
  })
...