Загрузите BLOB-объект с помощью Set-AzStorageBlobContent через конвейер и установите свойство ContentType. - PullRequest
0 голосов
/ 11 марта 2020

Используя модуль Az PowerShell, я пытаюсь перечислить каталог на диске и направить вывод в Set-AzStorageBlobContent для загрузки в Azure, сохраняя при этом структуру папок. Это прекрасно работает, за исключением того, что свойство ContentType всех BLOB-объектов установлено на application/octet-stream. Я хотел бы установить его динамически в зависимости от расширения файла загружаемого большого двоичного объекта.

Вот пример кода для базового случая:

Get-ChildItem $SourceRoot -Recurse -File |
    Set-AzStorageBlobContent -Container $ContainerName -Context $context -Force

Чтобы установить ContentType, я необходимо добавить Properties параметр к Set-AzStorageBlobContent со значением, подобным @{ "ContentType" = "<content type>" }. Тип содержимого должен определяться по указанному расширению файла c, которое загружается. Я написал отдельную конвейерную функцию, которая может добавить свойство MimeType к объекту файла, но я не могу понять, как ссылаться на это для параметра в конвейере. Пример:

function Add-MimeType{
    [cmdletbinding()]
    param(
        [parameter(
            Mandatory           = $true,
            ValueFromPipeline   = $true)]
        $pipelineInput
    )
    Process {
        $mimeType = Get-MimeType $pipelineInput.Extension
        Add-Member -InputObject $pipelineInput -NotePropertyName "MimeType" -NotePropertyValue $mimeType
        return $pipelineInput
    }
}

function Get-MimeType(
    [string]$FileExtension
)
{
    switch ($FileExtension.ToLowerInvariant())
    {
        '.txt'  { return 'text/plain' }
        '.xml'  { return 'text/xml' }
        default { return 'application/octet-stream' }
    }
}

Get-ChildItem $SourceRoot -Recurse -File |
    Add-MimeType |
        Set-AzStorageBlobContent -Container $ContainerName -Properties @{"ContentType" = "$($_.MimeType)"} -Context $context -Force

Кажется, что $_ не может использоваться в этом контексте. Есть ли другой способ выполнить sh это?

Причина, по которой я хотел бы продолжить использовать конвейерную обработку, заключается в том, что она работает намного быстрее, чем при использовании ForEach-Object l oop для вызова функции ( где $_ работает).

1 Ответ

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

Если вы открыты для совершенно разных решений, вы также можете использовать AzCopy .

Вы можете загрузить всю папку с помощью одной команды, и AzCopy также может автоматически угадать правильный тип пантомимы на основе расширения файла. Также существует поддержка Azure Pipelines , если это является частью вашей настройки.

Команда может выглядеть примерно так:

# AzCopy v10 will automatically guess the content type unless you pass --no-guess-mime-type
azcopy copy 'C:\myDirectory' 'https://mystorageaccount.blob.core.windows.net/mycontainer' --recursive

# AzCopy V8
azcopy copy 'C:\myDirectory' 'https://mystorageaccount.blob.core.windows.net/mycontainer' /s /SetContentType

Взят из вывода из AzCopy.exe copy --help:

AzCopy автоматически определяет тип содержимого файлов при загрузке с локального диска на основе расширения файла или содержимого (если расширение не указано).

Встроенная таблица поиска небольшая, но в Unix она дополняется файлом (файлами) локальной системы mime.types, если доступно под одним или несколькими из следующих имен:

  • / etc / mime.types
  • / etc / apache2 / mime.types
  • / etc / apache / mime.types

На Windows, MIME-типы извлечено из реестра. Эта функция может быть отключена с помощью флага. Пожалуйста, обратитесь к разделу флага.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...