作为目前正在开发的web应用程序的一部分,我需要将文件写入存储。最初将在Azure网站上托管,但将来我希望能够在非Azure服务器上托管。
所以,我正在寻找一个库(我希望它存在),它可以很容易地在输出文件到Azure Blob存储或本地文件系统之间切换。理想情况下,它将有一个通用的API,并允许您只通过更改配置文件在存储位置之间切换。
我在寻找具有这种功能的库时遇到了一些问题,我希望有人能为我指明正确的方向。
不确定是否存在这样的库。如果存在一个抽象库,我会认为它需要提供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");