Как использовать Azure SAS при попытке скопировать файл Azure в большой двоичный объект Azure

У меня есть частный Azure Blob. Я пытаюсь скопировать файлы Azure в большой двоичный объект. Они оба находятся в одной учетной записи хранения.

Когда я пытаюсь скопировать файл Azure в Blob, я получаю ошибку 404.

e.g. : await destinationBlob.StartCopyAsync(sourceCloudFile);

Предположение: это связано с тем, что мне нужно предоставить Подпись общего доступа в файле Azure.

Итак, я не уверен, как использовать SAS для копирования файла в Blob.

var policy = new Microsoft.WindowsAzure.Storage.File.SharedAccessFilePolicy()
{
    Permissions = Microsoft.WindowsAzure.Storage.File.SharedAccessFilePermissions.List,
    SharedAccessExpiryTime = new DateTimeOffset(DateTime.UtcNow.AddDays(1))
};
var sasToken = source.CloudFile.GetSharedAccessSignature(policy);

destinationBlob.Properties.ContentType = "image/jpg";

Хорошо - у меня есть жетон .. Что теперь?


person Pure.Krome    schedule 27.03.2017    source источник


Ответы (1)


Измените разрешение в вашем SharedAccessFilePolicy. Чтобы скопировать файл, разрешение должно быть Read, а не List.

var policy = new Microsoft.WindowsAzure.Storage.File.SharedAccessFilePolicy()
{
    Permissions = Microsoft.WindowsAzure.Storage.File.SharedAccessFilePermissions.Read,
    SharedAccessExpiryTime = new DateTimeOffset(DateTime.UtcNow.AddDays(1)
};

Как только вы получите SAS, вы просто создадите URL-адрес SAS для файла и вызовете StartCopy для своего CloudBlockBlob объекта.

var sasToken = source.CloudFile.GetSharedAccessSignature(policy);
var fileSasUri = new Uri(string.Format("{0}{1}", source.CloudFile.Uri.AbsoluteUri, sasToken));
var copyId = await destinationBlob.StartCopyAsync(fileSasUri);

Чтобы установить тип содержимого целевого большого двоичного объекта, после завершения копирования вы можете сделать что-то вроде:

destinationBlob.Properties.ContentType = "image/jpg";
await destinationBlob.SetPropertiesAsync();
person Gaurav Mantri    schedule 27.03.2017
comment
Ах! ta (тоже была плохой копией / вставкой). Но что мне делать дальше? У меня есть этот строковый URL ... как мне его использовать? - person Pure.Krome; 27.03.2017
comment
Woot! 50% работает !! Теперь файл скопирован (ура), но ContentType ... пуст? Это даже не application/octet или что-то еще по умолчанию. Я обновил вводный пост, чтобы показать, что именно я пытаюсь сделать. Можно StartCopyAsync установить свойства ContentType? - person Pure.Krome; 27.03.2017
comment
Какой тип содержимого исходного файла? Copy Blob операция просто скопирует тип содержимого исходного файла и установит это значение для типа содержимого большого двоичного объекта. Вы не можете указать тип содержимого целевого большого двоичного объекта во время копирования. Вам нужно будет выполнить другую операцию, чтобы установить свойства большого двоичного объекта. - person Gaurav Mantri; 27.03.2017
comment
:( The remote server returned an error: (409) Conflict. Я полагаю, это потому, что копирование еще не завершено? - person Pure.Krome; 27.03.2017
comment
Хорошо - нашел решение. Вы сказали, что операция Copy Blob просто скопирует тип содержимого исходного файла и установит для типа содержимого blob это значение.. Это означает, что он будет (1) копировать данные и (2) копировать свойства. Итак, я установил свойства файла Azure, после чего copyasync :) заработал! например: source.CloudFile.Properties.ContentType = "<whatever>"; await source.CloudFile.SetPropertiesAsync(); await destinationBlob.StartCopyAsync(fileSasUri); :) :) - person Pure.Krome; 27.03.2017