当前位置: 首页 > 知识库问答 >
问题:

避免在服务器上过度写入BLOB AZURE

昝成弘
2023-03-14

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

有没有办法在服务器上改变它,例如,防止替换已经存在的blob?

我已经看到了避免过度写入blobs AZURE,但它是关于客户端的。

我的目标是保护服务器免受重写blob的影响。

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

编辑

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

我知道在客户端处理替换的不同方法。然而,我需要在服务器上完成,甚至是在客户端上(这可能会被黑客破坏)。

共有3个答案

江棋
2023-03-14

有没有办法在服务器上改变它,例如,防止替换已经存在的blob?

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

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

为了避免重写现有的Blob,您需要为Blob操作显式指定条件头。简单来说,你可以利用Azure Storage SDK。NET(本质上是Azure Storage 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门户或存储工具上没有任何配置可以让你在服务器端达到这个目的。你可以试着把你的反馈发给Azure存储团队。

周睿范
2023-03-14

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

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

您可以使用REST API https://docs . Microsoft . com/en-us/REST/API/storage services/file services/blob-service-REST-API进行类似的操作

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

田化
2023-03-14

您可以使用“创建”权限发布SAS令牌,而不使用“写入”权限。这将允许用户上传大小不超过64 MB的Blob(允许的最大放置Blob),只要他们正在创建新Blob而不覆盖现有Blob。有关详细信息,请参阅SAS权限的说明。

 类似资料:
  • 如果我在文件已经存在的同一个容器中上传azure blob上的文件,它正在覆盖文件,如何避免覆盖相同的文件?下面我提到的场景... 步骤1-将文件“abc.jpg”上传到azure上名为“filecontainer”的容器中 第二步-一旦它被上传,尝试上传一些不同的同名文件到同一个容器 输出 - 它将用最新上传的文件覆盖现有文件 我的要求-我想避免这种覆盖,因为不同的人可能会将具有相同名称的文件上

  • 问题内容: 我在Heroku服务器上托管了一个网站( 我是Heroku btw的新用户 ),并且由于它是免费软件包,因此在 闲置30m 后便 进入 休眠 状态 ,并在用户点击它后再次将其投入使用,大约需要7秒才能成功。 我正在考虑运行nodejs作业或每隔29m就会打开网站的一次作业,以使服务器永不休眠,最初,我得到的是这样的内容: 注意:那只是在浏览器中打开它,而不是关闭它。 首先,这样做是否合

  • 在我的项目中,我有一些软件包,如: 我为每种包定义了几个记录器,例如: 还有更多... 问题是,当我使用com.project编写日志时。在我的记录器中,输出被写入com.project。我的滚动文件日志并进入com。项目文件日志。 我只是想把输出写进com.project。仅限我的文件日志。我怎么解决这个问题?

  • 我有一个实现远程后台服务的应用程序。这个服务是用来下载线程中的文件的(我想说这个服务是作为下载管理器工作的)。 当我想下载一个文件时,我将url发送给服务,服务启动一个线程(我使用的是AsyncTask,但它只在Android4.1中工作)。但下载迟早会停止,我能够知道这一点,因为我显示的通知不再更新。当我单击取消下载的通知时,将向服务发送一个挂起的意图,告诉它取消下载,但当服务重新创建时,将取消

  • 我创建了两个表。它们由主键和外键连接。当我插入新值时,它说不能在对象中插入重复的键。这是我的表 这是我的插入声明 以下是错误消息 违反主键约束“PK__person__228E26BE3A9512B2”。无法在对象“dbo”中插入重复密钥。“人”。重复的键值为(333)。 谁能给我指路吗?非常感谢

  • 你好,我有错误,如java.lang.NullPointerException上OutputStream out=ftp.storeFileStream(路径);. 你能帮帮我吗?代码编写了第一个图像,并完全停止了编写。这是我的方法代码。。。。。。。。 我将发布两个单独的代码。事实上这是一种方法。 这是NPE错误! java.lang.NullPointerException atcom.scm.