在Azure中添加,编辑元数据

时间:2017-10-25 14:29:00

标签: c# asp.net-mvc azure metadata azure-storage

我最近在这里问了一个问题,感谢Gaurav Mantri我可以添加元数据到blob azure。 在AzureBlobStorage类中编辑后的代码:

  public void SaveMetaData(string fileName, string container, string key, string value)
{
    var blob = GetBlobReference(fileName, container);
        blob.FetchAttributes();
        blob.Metadata.Add(key, value);
        blob.SetMetadata();
}

我通过myController调用它:

public JsonResult SaveMetaData(string name, string key, int id)
    {
        var uploadedFils = _FileStorage.GetUploadedFiles("images", id + "/");


if (!uploadedFils.Any())
                _FileStorage.SaveMetaData(name, "images", key, "true");
        foreach (var file in uploadedFils)
        {
            if (name == file.Name)
            {
                _FileStorage.SaveMetaData(FormatFileName(id, name), "images", key, "true");

            }
            else
            {
                _FileStorage.SaveMetaData(FormatFileName(id, file.Name), "images", key, "false");

            }
        }
        return Json("");


    }

获取上传文件的代码

public IEnumerable<Attachment> GetUploadedFiles(string container, string blobprefix)
    {
        if (string.IsNullOrWhiteSpace(container))
            container = DefaultBlobContainer;

        var storageAccount = CreateStorageAccountFromConnectionString(GetStorageConnectionString());
        var blobContainer = GetBlobContainer(storageAccount, container);

        var resultList = new List<Attachment>();
        try
        {
            foreach (IListBlobItem item in blobContainer.ListBlobs(blobprefix, false))
            {
                var blob = (CloudBlockBlob) item;
                var file = new Attachment
                {
                    Name = blob.Name.Substring(blob.Name.LastIndexOf('/') + 1),
                    Size = blob.Properties.Length,
                    Extension = Path.GetExtension(blob.Name)
                };
                resultList.Add(file);
            }
        }
        catch (Exception e)
        {

        }

        return resultList;
    }

当我点击想要设置为活动状态的所需图像时,我会调用此操作。 这是第一次有效,但我不知道如何编辑它第二次点击,特别是这是我第一次与Azure打交道? 这一行背后的逻辑:当图库为空并且用户上传第一张图像时,该图像将自动设置为活动状态:

    if (!uploadedFils.Any())
            _FileStorage.SaveMetaData(name, "images", key, "true");

1 个答案:

答案 0 :(得分:1)

根据您的描述,我检查了您的代码,您需要修改您的代码,如下所示:

AzureBlobStorage类下的

SaveMetaData 方法:

public void SaveMetaData(string fileName, string container, string key, string value)
{
    var blob = GetBlobReference(fileName, container);
    blob.FetchAttributes();
    if (blob.Metadata.ContainsKey(key))
    {
        blob.Metadata[key] = value;
    }
    else
        blob.Metadata.Add(key, value);
    blob.SetMetadata();
}

根据您的方案,您的图片文件将上传到images\{id}\{filename}。在调用控制器下的 SaveMetaData 之前,需要确保blob存储中存在具有特定参数nameid的文件。我假设您需要删除以下代码段:

if (!uploadedFils.Any())
   FileStorage.SaveMetaData(name, "images", key, "true");

注意:如果没有文件,则无法为其添加/更新元数据。另外,您只需为参数name设置fileName,而无需合并id。根据我的理解,SaveMetaData方法用于为现有文件设置元数据。我建议您将上述逻辑移至上传文件的操作,如果没有文件则设置默认元数据。