从加载到MemoryStream中的文件中获取文件扩展名或类型是否可能?

7
我正在使用C#创建一个服务,该服务将由ASP.Net Web API使用,用于处理和存储文件。
作为Web API的一部分,我将文件存储在MemoryStream中,然后将其传递给实际处理和存储的服务。
服务的一部分将是为每个文件生成新文件名。
这就引出了一个问题,现在它已经在MemoryStream中,是否有可能找出文件类型/扩展名?

1
为什么不在加载这些文件时将那些信息存储在某个地方,而不是试图猜测呢? - EZI
文件类型/扩展名将作为参数与文件字节一起传入。文件类型/扩展名是一个纯主观的事情。除了实际分析字节与已知文件格式相比较之外,没有其他方法可以确定。 - Nick Zimmerman
是的 @EZI,那是我考虑过的一个选项;同时获取扩展名和流并将它们都传递到服务中。我不确定是否可以从MemoryStream中确定它们;这样就不需要“猜测”了。 - Darren Wainwright
3个回答

3

没有文件扩展名时,你可以猜测文件类型:

除非文件内容本身包含名称/扩展名,否则MemoryStream不包含任何关于原始文件名的信息。

您可以尝试通过读取流的一些/全部内容来检测文件类型(例如,许多格式在开头有魔数/签名)。

还有几个类似的问题,比如使用.NET,如何根据文件签名而不是扩展名找到文件的MIME类型(讨论了使用UrlMon来检测类型)。


谢谢提供链接。这正是我在寻找的东西——看起来比一开始就传递它更麻烦。 - Darren Wainwright
@Darren 是的... 如果你可以询问文件类型并且不必验证它,那么要求调用者提供文件类型是更容易和更可靠的选择。 - Alexei Levenkov

3
您需要检查数据并根据您预期处理的内容类型的特征确定其内容类型。更好的解决方案是在加载文件时将该信息作为过程的一部分捕获,并将其随文件一起传递。
为了捕获该信息,可以假设文件扩展名告诉您它是什么类型,或者让用户(或调用代码)从有效文件类型列表中进行选择。
这篇Super User的帖子可能很有用,他们讨论了基于内容检测文件类型的方法。

2
不,MemoryStream 不知道或不关心其字节的来源。
您可以从前几个字节猜测文件格式。我确信网上有可用的代码来解决这个问题。
或者,只需让您的服务调用方传输此信息即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接