Установите ContentType для элемента хранилища BLOB-объектов Azure - PullRequest
0 голосов
/ 16 мая 2018

Я пишу сервис, который загружает / загружает элементы из хранилища BLOB-объектов Azure .Когда я загружаю файл, я устанавливаю ContentType .

public async Task UploadFileStream(Stream filestream, string filename, string contentType)
{
    CloudBlockBlob blockBlobImage = this._container.GetBlockBlobReference(filename);
    blockBlobImage.Properties.ContentType = contentType;
    blockBlobImage.Metadata.Add("DateCreated", DateTime.UtcNow.ToLongDateString());
    blockBlobImage.Metadata.Add("TimeCreated", DateTime.UtcNow.ToLongTimeString());
    await blockBlobImage.UploadFromStreamAsync(filestream);
}

Однако, когда я получаю файл, ContentType равен нулю.

public async Task<CloudBlockBlob> GetBlobItem(string filename)
{
    var doesBlobExist = await this.DoesBlobExist(filename);
    return doesBlobExist ? this._container.GetBlockBlobReference(filename) : null;
}

В моем коде, использующем эти методы, я проверяю ContentType возвращенного BLOB-объекта, но он равен нулю.

var blob = await service.GetBlobItem(blobname);
string contentType = blob.Properties.ContentType; //this is null!

Я пытался использовать SetProperties () метод в моем методе UploadFileStream () (выше), но он тоже не работает.

CloudBlockBlob blockBlobImage = this._container.GetBlockBlobReference(filename);
blockBlobImage.Properties.ContentType = contentType;
blockBlobImage.SetProperties(); //adding this has no effect
blockBlobImage.Metadata.Add("DateCreated", DateTime.UtcNow.ToLongDateString());
blockBlobImage.Metadata.Add("TimeCreated", DateTime.UtcNow.ToLongTimeString());
await blockBlobImage.UploadFromStreamAsync(filestream);

Так как мне установить ContentType для элемента BLOB-объектав хранилище BLOB-объектов Azure?

1 Ответ

0 голосов
/ 16 мая 2018

Проблема со следующей строкой кода:

this._container.GetBlockBlobReference(filename)

По сути, это создает экземпляр CloudBlockBlob на стороне клиента. Он не делает никаких сетевых звонков. Поскольку этот метод просто создает экземпляр на стороне клиента, все свойства инициализируются со значениями по умолчанию, и поэтому вы видите свойство ContentType как нулевое.

Что вам нужно сделать, так это сделать сетевой вызов, чтобы получить свойства BLOB-объекта. Вы можете вызвать метод FetchAttributesAsync() для объекта CloudBlockBlob, и тогда вы увидите, что свойство ContentType заполнено правильно.

Имейте в виду, что метод FetchAttributesAsync может выдать ошибку (например, 404, если BLOB-объекта не существует), поэтому убедитесь, что вызов этого метода заключен в блок try / catch.

Вы можете попробовать код, как показано ниже:

public async Task<CloudBlockBlob> GetBlobItem(string filename)
{
  try
  {
    var blob = this._container.GetBlockBlobReference(filename);
    await blob.FetchAttributesAsync();
    return blob;
  }
  catch (StorageException exception)
  {
    return null;
  }
}
...