避免在服务器

时间:2016-12-14 18:18:55

标签: azure azure-storage azure-storage-blobs

我有一个.NET应用程序,它使用WebClient和SAS令牌将blob上传到容器。默认行为是替换/覆盖具有相同名称的blob。

有没有办法在服务器上更改它,即阻止替换现有的blob?

我见过Avoid over-writing blobs AZURE,但它是关于客户端的。

我的目标是确保服务器不会覆盖blob。

AFAIK文件直接上传到容器,没有机会拦截请求并检查例如blob的存在。

被修改

让我澄清一下:我的客户端应用程序收到SAS令牌以上传新的blob。但是,邪恶的黑客可以拦截令牌并上传具有现有名称的blob。由于默认行为,新的blob将替换现有的blob(有效删除好的blob)。

我知道在客户端处理替换的不同方法。但是,我需要在服务器上进行,甚至对客户端(可能被黑客入侵)。

3 个答案:

答案 0 :(得分:0)

服务器端没有配置,但您可以使用存储客户端sdk实现一些代码。

//检索对先前创建的容器的引用 var container = blobClient.GetContainerReference(containerName);
//检索对blob的引用。
var blobreference = container.GetBlockBlobReference(blobName);
//如果存在引用则不执行任何操作 //或者上传blob。

你可以使用REST api做类似的事情 https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/blob-service-rest-api

GetBlobProperties,如果blob不存在,将返回404。

答案 1 :(得分:0)

  

有没有办法在服务器上更改它,即阻止替换现有的blob?

Azure存储服务公开Blob服务REST API,以便您对Blob执行操作。要上传/更新Blob(文件),您需要调用Put Blob REST API,其说明如下:

  

Put Blob操作会创建新的块,页面或追加blob,或更新现有块blob的内容。更新现有块blob会覆盖blob上的所有现有元数据。 Put Blob不支持部分更新;现有blob的内容将被新blob的内容覆盖。

为了避免覆盖现有的Blob,您需要为Blob Operations明确指定Conditional Headers。简单来说,您可以利用Azure Storage SDK for .NET(实际上是Azure存储REST API的包装器)上传Blob(文件),以避免覆盖Blob:

try
{
    var container = new CloudBlobContainer(new Uri($"https://{storageName}.blob.core.windows.net/{containerName}{containerSasToken}"));
    var blob = container.GetBlockBlobReference("{blobName}");
    //bool isExist=blob.Exists();
    blob.UploadFromFile("{filepath}", accessCondition: AccessCondition.GenerateIfNotExistsCondition());
}
catch (StorageException se)
{
    var requestResult = se.RequestInformation;
    if(requestResult!=null)
        //409,The specified blob already exists.
        Console.WriteLine($"HttpStatusCode:{requestResult.HttpStatusCode},HttpStatusMessage:{requestResult.HttpStatusMessage}");
}

此外,您可以在上传到Azure Blob存储之前将blob名称与blob文件的MD5代码结合使用。

众所周知,Azure Portal或存储工具上没有任何配置可供您在服务器端实现此目的。您可以尝试将feedback发布到Azure存储团队。

答案 2 :(得分:0)

您可以使用“创建”权限发出SAS令牌,而无需“写入”权限。这将允许用户上传最大64 MB的blob(允许的最大Put Blob),只要他们创建新blob并且不覆盖现有blob。有关详细信息,请参阅SAS permissions的说明。