Azure Media Services (AMS) に既存の Blob ストレージ上のファイルを直接インポートする際、
CreateFromBlob メソッドを使用することがある。この処理中に以下のようなエラーが発生することがある:
<?xml version="1.0" encoding="utf-8"?>
<m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<m:code />
<m:message xml:lang="en-US">AssetFile ContentFileSize must not be negative</m:message>
</m:error>
このエラーは、Blob のメタデータ(特にサイズ情報)が AMS 側で正しく取得できていないことを示している。根本的な原因は、
CloudBlockBlob オブジェクトのプロパティが初期化されていないことにある。
解決策は、Blob 参照を取得した後に
FetchAttributes() を呼び出して、Blob の実際のメタデータ(サイズ、コンテンツタイプなど)を明示的に取得することである。
また、ストレージ資格情報(
StorageCredentials)には必ずアカウント名とアカウントキーの両方を含める必要がある。SAS トークンのみではこの操作はサポートされない。
以下は、Blob から AMS アセットを作成するための修正済みコード例である:
public string UploadBlobToAsset(string blobUri)
{
var accountName = ConfigurationManager.AppSettings["StorageAccountName"];
var accountKey = ConfigurationManager.AppSettings["StorageAccountKey"];
// Blob URI からコンテナー名と BLOB 名を抽出(環境に応じて調整)
var uri = new Uri(blobUri);
var segments = uri.Segments;
var containerName = segments[1].TrimEnd('/');
var blobName = segments[2];
var storageCredentials = new StorageCredentials(accountName, accountKey);
var blobClient = new CloudBlobClient(uri, storageCredentials);
var container = blobClient.GetContainerReference(containerName);
var blockBlob = container.GetBlockBlobReference(blobName);
// 必須:Blob の属性(特に Length)を取得
blockBlob.FetchAttributes();
// AMS コンテキストの初期化(省略)
InitializeMediaContext();
// Blob からアセットを作成
var asset = _mediaContext.Assets.CreateFromBlob(
blockBlob,
storageCredentials,
AssetCreationOptions.None
);
// SAS URL を生成して返す
return GenerateSasUrl(asset);
}
InitializeMediaContext() は Azure AD 認証を使って AMS REST API に接続する標準的な初期化処理を含む。また、
GenerateSasUrl はアセットに SAS ロケーターを作成し、MP4 ファイルのダウンロード URL を返すヘルパー関数とする。
注意点として、
StorageConnectionString を使わずに、明示的に
accountName と
accountKey を AppSettings から読み込む方が安全かつ確実である。接続文字列の解析ミスや権限不足がエラーの原因となることがある。
最後に、HTML のファイルアップロードコントロール経由でファイルを受け取る場合は、サーバー側の一時ディレクトリに保存 → AMS にアップロード → 一時ファイルを削除、というフローが推奨される。ブラウザから直接 Blob URI を渡すことは通常不可能であるため、間接的な処理が必要になる。