Azure存储/文件系统抽象库

时间:2014-09-28 09:24:52

标签: file-io azure-storage azure-storage-blobs

作为我目前正在开发的Web应用程序的一部分,我需要将文件写入存储。最初将托管在Azure网站上,但将来我希望能够在非Azure服务器上托管它。

所以 - 我正在寻找一个库(我希望它存在),这样可以轻松地在输出文件到Azure Blob存储或本地文件系统之间切换。理想情况下,具有通用API的东西允许您通过仅更改配置文件在存储位置之间切换。

我在寻找具有此类功能的库时遇到了一些问题,我希望有人能指出我正确的方向。

1 个答案:

答案 0 :(得分:0)

不确定此类库是否存在。如果存在一个抽象库,那么我认为它需要提供Azure,S3,本地FileSytem,Rackspace等的实现。

无论如何,实施起来相当简单。我们的项目有两个不同的版本,基于云和内部部署,主要的真正区别是Blob存储。我们所做的是针对一个接口构建核心上传/下载等逻辑,对Azure Blob存储有一个不同的实现,一个用于本地文件存储,使用StructureMap来获取基于配置值的具体实现的引用

我们显然没有在界面中复制每个BLOB存储API,而只是我们系统所需的最小值

一些代码示例:

接口:(BlobBase是我们的自定义类,包含容器名称,文件名,内容类型等信息。BlobStorageProviderStatus是自定义枚举,提供一些状态信息。但是你明白了!)

public interface IBlobStorageProvider
{
    void CreateContainer(string containerName);
    BlobStorageProviderStatus UploadFile(BlobBase file, bool uploadAsNewversion, Stream data, int chunk, int totalChunks, out string version);
    BlobStorageProviderStatus DownloadToStream(BlobBase file, Stream target, int chunkSize, IClientConnection clientConnection);
    void Delete(BlobBase blobBase);
    void DeleteDirectory(string directoryPath, string blobContainer);
    BlobStorageProviderStatus UploadFile(string container, string folder, string fileName, Stream data, string contentType);
    void DownloadToStream(string container, string filePath, Stream target);
}

Web.config有

<add key="AzureBlobStorage" value="true" />

和StructureMap注册的简化版本:

  x.For<IBlobStorageProvider>()
                     .Use(() => bool.Parse(ConfigurationManager.AppSettings["AzureBlobStorage"])
                                    ? new AzureBlobStorageProvider()
                                    :  new FileSystemStorageProvider());

和实际使用样本:

 IBlobStorageProvider blobStorage = ObjectFactory.GetInstance<IBlobStorageProvider>();
 blobStorage.CreateContainer("image");