UPD:这是我实现的这个问题的解决方案
我正在尝试通过Azure.Storage库(不是REST API)上传到Azure blob存储,并通过共享访问密钥进行身份验证.
我看过这篇博文,但是自帖子以来API已经发生了变化,现在我无法得到相同的结果.
这是我有的:
var blobClient = new CloudBlobClient(new Uri(blobWithSas.BaseUri), new StorageCredentials(blobWithSas.Sas));
// here I receive 404 error
var blob = blobClient.GetBlobReferenceFromServer(new Uri(blobWithSas.AbsoluteUri));
using (var stream = new FileStream(fullFilePath, FileMode.Open))
{
blob.UploadFromStream(stream);
}
Run Code Online (Sandbox Code Playgroud)
有:
blobWithSas.BaseUri= http://127.0.0.1:10000/devstoreaccount1/a6dc9274-6ce1-4095-be6b-e84d1012cb24(Guid是容器的名称,已存在,在其他地方创建.)
blobWithSas.Sas= ?sv=2012-02-12&se=2013-06-23T03%3A04%3A53Z&sr=b&sp=w&sig=NaMqgXRMXDFvLAp8LTskgplAKp%2B9LCZzq8WK9Zo35x8%3D(也在代码中的其他地方发布)
blobWithSas.AbsoluteUri = http://127.0.0.1:10000/devstoreaccount1/a6dc9274-6ce1-4095-be6b-e84d1012cb24/foldername/filename.txt
blob不存在,我想上传新文件并创建一个blob.我有"服务器"应用程序持有Azure存储帐户的访问密钥.服务器将向客户端发出SAS,客户端将文件直接上载到Azure.所以SAS只会写,没有阅读,客户端将创建服务器告诉他们的文件(容器,文件夹名称)
问题出现了GetBlobReferenceFromServer- 我从Azure存储中收到404错误.是的,blob不存在且没有引用.因此,给定CloudBlobClient,如何将文件上传到blob?
ps我意识到这些东西有REST API.但我之前使用过Microsoft.WindowsAzure.Storage库,如果可能的话,我希望避免使用REST服务.
我们使用log4net和自定义appender来记录我们从azure机器到table store的东西,这很好用.我们现在需要的是使用blob-store在一个地方配置我们所有实例的日志记录,并且能够在运行时修改它,只需修改blob存储中的配置文件,不久之后我的所有机器都应该知道这个更改.
简单地说我需要的是:
XmlConfigurator.Configure(Uri blobStoreUri, bool watch=true)
Run Code Online (Sandbox Code Playgroud)
甚至更好:
XmlConfigurator.ConfigureAndWatch(string blobStoreUrl, TimeSpan refreshInterval)
Run Code Online (Sandbox Code Playgroud)
我用Google搜索,但却找不到那样的东西.实现这个的最佳方法是什么,或者你知道任何类似的实现吗?
谢谢almir
我正在尝试创建一个实用程序来从Internet下载文件并将其再次上载到Azure blob存储.Blob容器已经很好了; 但由于某种原因,当我试图将文件上传到存储时,我收到"Bad Request 400"异常...容器名称已创建,小写字母,所以特殊字符.但我仍然不知道为什么我会得到例外!
请帮忙.
注意:
这是一个例外:
An exception of type 'Microsoft.WindowsAzure.Storage.StorageException'
occurred in Microsoft.WindowsAzure.Storage.dll but was not handled in user code
Additional information: The remote server returned an error: (400) Bad Request.
Run Code Online (Sandbox Code Playgroud)
以下是代码:
foreach (var obj in objectsList)
{
var containerName = obj.id.Replace("\"", "").Replace("_", "").Trim();
CloudBlobContainer blobContainer = blobClient.GetContainerReference(containerName);
if (blobContainer.Exists())
{
var fileNamesArr = obj.fileNames.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var sora in fileNamesArr)
{
int soraInt = int.Parse(sora.Replace("\"", ""));
String fileName = …Run Code Online (Sandbox Code Playgroud) 我在Azure中创建了一个虚拟机,然后将其删除.但是,关联的存储帐户仍然存在.我无法删除存储帐户,因为它包含一个容器,其中包含一个具有无限期租约的blob.
没有其他人使用此存储帐户.
我该如何删除这个blob?
我正在寻找一种通过ARM模板在Azure blob和文件共享存储中创建容器的方法.
目前我有ARM模板来配置存储帐户,但我想在ARM中创建容器.
{
"name": "[parameters('storageAccountName')]",
"type": "Microsoft.Storage/storageAccounts",
"location": "[resourceGroup().location]",
"apiVersion": "[variables('storageApiVersion')]",
"sku": {
"name": "[variables('storageAccountType')]"
},
"dependsOn": [ ],
"tags": {
"Environment": "[parameters('Environment')]",
"Project": "[parameters('ProjectName')]",
"Contact": "[parameters('ContactName')]"
},
"kind": "Storage",
"properties": {
"encryption": {
"keySource": "Microsoft.Storage",
"services": {
"blob": {
"enabled": true
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud) azure azure-storage azure-storage-blobs azure-resource-manager azure-storage-files
我们的应用程序将从客户上传的文件存储到blob存储.这些文件在不同方(我们的客户及其供应商)之间交换.有没有办法检查上传的文件是否有病毒?反恶意软件服务似乎只是检查虚拟机,但我无法获得有关使用它来检查文件即服务的任何信息.
一个很好的解决方案是,如果我们可以将这样的文件存储在Azure存储中作为"保留"文件,直到它被检查.然后我们需要一个服务来检查这个文件并返回结果.如果该文件没有病毒,我们可以将其移动到最终目的地.
适用于多租户应用程序的Azure存储.我们正在开发Azure上的多租户应用程序,每个租户需要大约10,000个租户和大约100 GB到1 TB的数据存储.该应用程序将分别维护文档和二进制内容以及每个租户的元数据.我们正在考虑使用Azure Block Blob存储来存储数据.因为,要求是为每个租户分开数据,我们遇到了以下方法.
我们对我们的方法有以下疑问:
我正在尝试使用.NET 4.5异步和等待实现完全异步的 blob下载.
让我们假设整个blob可以立即适应内存,我们想把它保存在一个string.
码:
public async Task<string> DownloadTextAsync(ICloudBlob blob)
{
using (Stream memoryStream = new MemoryStream())
{
IAsyncResult asyncResult = blob.BeginDownloadToStream(memoryStream, null, null);
await Task.Factory.FromAsync(asyncResult, (r) => { blob.EndDownloadToStream(r); });
memoryStream.Position = 0;
using (StreamReader streamReader = new StreamReader(memoryStream))
{
// is this good enough?
return streamReader.ReadToEnd();
// or do we need this?
return await streamReader.ReadToEndAsync();
}
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageAccountConnectionString"));
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("container1");
CloudBlockBlob blockBlob = container.GetBlockBlobReference("blob1.txt"); …Run Code Online (Sandbox Code Playgroud) 使用Express with Node,我可以成功上传文件并将其传递到以下代码块中的Azure存储.
app.get('/upload', function (req, res) {
res.send(
'<form action="/upload" method="post" enctype="multipart/form-data">' +
'<input type="file" name="snapshot" />' +
'<input type="submit" value="Upload" />' +
'</form>'
);
});
app.post('/upload', function (req, res) {
var path = req.files.snapshot.path;
var bs= azure.createBlobService();
bs.createBlockBlobFromFile('c', 'test.png', path, function (error) { });
res.send("OK");
});
Run Code Online (Sandbox Code Playgroud)
这很好用,但Express会创建一个临时文件并先存储图像,然后我从文件中将其上传到Azure.这似乎是一个低效且不必要的步骤,我最终必须管理临时文件目录的清理.
我应该能够使用blobService.createBlockBlobFromStreamAzure SDK中的方法将文件直接流式传输到Azure存储,但我不熟悉Node或Express以了解如何访问流数据.
app.post('/upload', function (req, res) {
var stream = /// WHAT GOES HERE ?? ///
var bs= azure.createBlobService();
bs.createBlockBlobFromStream('c', 'test.png', stream, function (error) { });
res.send("OK");
});
Run Code Online (Sandbox Code Playgroud)
我发现以下博客表明可能有办法这样做,当然Express也会抓取流数据并解析并将其保存到文件系统中. …
我看到有不同种类的URL来访问blob存储,如下所示:
wasb://XXXXXXXXXX@XXXXX.blob.core.windows.net
https://XXXXXXXXXX@XXXXX.blob.core.windows.net
Run Code Online (Sandbox Code Playgroud)
有什么不同?可能是差异的原因是什么?