C# IFileRepositoryProvider处理上传的文件
根据系统所在的环境,它将使用不同的“文件系统”来管理用户上传的文件。例如,在我们的开发环境中,我们使用windows文件系统,但在生产环境中,我们使用Azure blob存储 使用提供者模型,我创建了以下接口:C# IFileRepositoryProvider处理上传的文件,c#,.net,azure,file-io,stream,C#,.net,Azure,File Io,Stream,根据系统所在的环境,它将使用不同的“文件系统”来管理用户上传的文件。例如,在我们的开发环境中,我们使用windows文件系统,但在生产环境中,我们使用Azure blob存储 使用提供者模型,我创建了以下接口: public interface IFileRepositoryProvider { void SaveFile(string fileName, Stream fileStream); void DeleteFile(string fileName); bo
public interface IFileRepositoryProvider
{
void SaveFile(string fileName, Stream fileStream);
void DeleteFile(string fileName);
bool Exists(string fileName);
Stream GetStream(string fileName);
}
- 有关如何保存/删除文件/etc的详细信息完全由
的具体实现封装IFileRepositoryProvider
- Azure blob存储存在一些限制。我不一定要为文件提供一个直接的“URI”,就像我们在web服务器上的某个虚拟目录中托管文件一样因此,我决定完全使用流。根据需要由客户机代码处理流
还是FileStream
更好MemoryStream
- 将文件公开为字节数组是否有好处
- 你能看出这种方法有什么严重的缺点吗
或者您可以在标识符中包含一些特定于上下文的信息。是否使用FileStream、MemoryStream或其他流类型并不重要;您的接口应该只接受一个流,然后可以处理各种不同的输入 我想说流比字节数组更灵活。不过,需要注意的一点是,在将流传递到接口之前,您通常必须记住在流上设置position=0 您还应该考虑async以及是否要处理正确的流式传输,即在仍然从客户端接收数据的情况下写入Azure blob存储(这可能会有点棘手,因为Azure存储API的工作方式) 我想说的一件事是,您的界面看起来像是在试图使Azure blob存储像文件系统一样运行,重点是文件名。Azure blob存储中关于文件的调用有一定的限制;本质上,您的“名称”需要进行URI编码。我发现更好的方法是接受Azure blob存储有效地处理标识符的想法,然后尝试在文件系统上模拟该标识符。因此,当您“保存”一个文件时,您将传入一个名称和一个流,并将返回一个作为标识符的字符串(它实际上是一个URI或URI的一部分)。客户端必须存储该标识符,并且在检索文件时必须提供该标识符 这样做的另一个好处是,您的实现负责生成标识符,因此可以在标识符中包含Guid,以避免任何名称冲突 最后,如果您计划在Azure Blob存储中存储大量文件,您应该知道浏览速度很慢,几乎不可能进行搜索。因此,为了使支持更容易,请仔细考虑如何构造标识符。虽然技术上Blob存储是扁平的,但您可以通过在标识符中包含“/”来模拟文件夹结构。因此,例如,您可以创建一个标识符,如year+“/”+month+“/”+day+“/”+guid+“/”+Uri.Encode(文件名)。
或者,您可以在标识符中包含一些特定于上下文的信息。在Windows Azure中运行时,blob是存储在公共容器中还是存储在私有容器中?在Windows Azure中运行时,blob是存储在公共容器中还是存储在私有容器中?Windows Azure存储客户端库中有一种方法可用于检查blob是否存在@迈克:啊,我的错。谢谢你指出这一点。回答已更新。Windows Azure存储客户端库中有一个方法可用于检查blob是否存在@迈克:啊,我的错。谢谢你指出这一点。答案已更新。