【问题标题】:Is it possible to get the file extension or type from a file loaded into MemoryStream?是否可以从加载到 MemoryStream 中的文件中获取文件扩展名或类型?
【发布时间】:2014-07-18 00:23:37
【问题描述】:

我正在用 C# 创建一个服务,供 ASP.Net Web API 使用,该 API 将处理和存储文件。

作为 Web API 的一部分,我将文件存储在 MemoryStreams 中,然后将其传递给服务进行实际处理和存储。

服务的一部分是为每个文件生成一个新的文件名。

所以这让我想到了一个问题,是否可以找出文件现在位于 MemoryStream 中的文件类型/扩展名?

【问题讨论】:

  • 为什么在加载这些文件时不将这些信息存储在某个地方,而不是尝试猜测?
  • 文件类型/扩展名必须作为文件字节的参数。文件类型/扩展名纯粹是主观的事情。与已知文件格式相比,没有实际分析字节,无法判断。
  • 是的@EZI,这是我考虑过的一个选项;同时获取扩展和流,并将它们都传递到服务中。我不确定是否可以从 MemoryStream 中以某种方式确定它;那么就不会有“猜测”了..

标签: c# memorystream


【解决方案1】:

没有扩展名,你可以猜类型:

除非文件内容以某种方式包含名称/扩展名MemoryStream,否则它本身不包含有关原始文件名的任何信息。

您可以尝试通过读取流的部分/全部内容来检测文件的类型(例如,许多格式的开头都有magic number/signature)。

还有几个类似的问题,如Using .NET, how can you find the mime type of a file based on the file signature not the extension(讨论使用UrlMon检测类型)。

【讨论】:

  • 感谢您的链接。这就是我一直在寻找的那种东西——我猜一开始它看起来更像是一种痛苦。
  • @Darren 是的...如果您可以询问文件类型并且不必验证它,比要求调用者提供文件类型更容易且更可靠的选择。
【解决方案2】:

您必须检查数据并根据您希望处理的内容类型的特征查看它是什么内容类型。更好的解决方案是在加载文件时将这些信息作为过程的一部分进行捕获,并与它一起传递。

要捕获该信息,请假设文件扩展名告诉您它是什么类型,或者让用户(或调用代码)从有效文件类型列表中进行选择。

This post on Super User 可能有用,他们讨论了根据内容检测文件类型。

【讨论】:

    【解决方案3】:

    不,MemoryStream 不知道也不关心它的字节来自哪里。

    您可以从前几个字节猜测文件格式。我确信网络上有可用的代码来执行此操作。

    或者,只是让您的服务的调用者传输此信息。

    【讨论】:

      猜你喜欢
      • 2010-11-05
      • 2013-05-28
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      相关资源
      最近更新 更多