Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IFileRepositoryProvider处理上传的文件_C#_.net_Azure_File Io_Stream - Fatal编程技术网

C# IFileRepositoryProvider处理上传的文件

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

根据系统所在的环境,它将使用不同的“文件系统”来管理用户上传的文件。例如,在我们的开发环境中,我们使用windows文件系统,但在生产环境中,我们使用Azure blob存储

使用提供者模型,我创建了以下接口:

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
    更好
  • 将文件公开为字节数组是否有好处
  • 你能看出这种方法有什么严重的缺点吗

您是否使用文件流、内存流或其他流类型并不重要;您的接口应该只接受一个流,然后可以处理各种不同的输入

我想说流比字节数组更灵活。不过,需要注意的一点是,在将流传递到接口之前,您通常必须记住在流上设置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(文件名)。
或者您可以在标识符中包含一些特定于上下文的信息。

是否使用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是否存在@迈克:啊,我的错。谢谢你指出这一点。答案已更新。