何时使用 Symfony 的 UploadedFile guessClientExtension() 与 guessExtension()?

When to use Symfony's UploadedFile guessClientExtension() vs guessExtension()?

从 ReactJS/Javascript 前端应用程序上传文件到 Symfony 4 后端,我尝试获取它的文件扩展名。

收到文件后,我实例化了一个 UploadedFile 对象,它具有以下可用方法:

$uploadedFile->getClientOriginalExtension();
$uploadedFile->getClientMimeType();
$uploadedFile->guessClientExtension();
$uploadedFile->guessExtension();

我希望这些 getter 能够 return 一致的结果,但事实并非如此。

Return 名为 image-ile.jpg 的上传文件的结果是:

getClientOriginalExtension() -> ''
getClientMimeType()          -> 'application/octet-stream'
guessClientExtension()       -> 'bin'
guessExtension()             -> 'jpeg'
`

Image file is sent using javascript FormData, with `Content-Type: multipart/form-data`:

> ------WebKitFormBoundaryvFjJSluadmvCob6T
Content-Disposition: form-data; name="image-ile.jpg"; filename="image-ile.jpg"
Content-Type: image/jpeg

In my case, the `guessClientExtension()` doesn't return the relevant file extension while the `guessExtension()` does. So in which cases should I use one getter instead of the other one?

大多数情况下,您应该使用 guessExtension() 而不是 guessClientExtenstion()

后者使用客户端提供的 mime 类型来确定文件的扩展名。但我可以向您发送一个设置 mime 类型 image/jpg 的 Word 文件,您将设置不正确的扩展名。

与大多数事情一样,信任客户从来都不是一个很好的做法,除非您有非常具体的理由这样做。

何时使用此值完全取决于应用程序,但在某些情况下,您可能有兴趣了解客户端实际发送的元数据。没有明确的“何时使用”列表,只是有时需要。想到日志记录和调试。

但简而言之:除非您有 guessClientExtension() 的特定用例,否则您可能对 guessExtension().

感兴趣

如果您检查每个功能的 the source code(您可以自己完成 IDE),您将看到 guessClientExtension() 的评论:

/**
 * Returns the extension based on the client mime type.
 *
 * If the mime type is unknown, returns null.
 *
 * This method uses the mime type as guessed by getClientMimeType()
 * to guess the file extension. As such, the extension returned
 * by this method cannot be trusted.
 *
 * For a trusted extension, use guessExtension() instead (which guesses
 * the extension based on the guessed mime type for the file).

guessExtension() 实际上定义了 on File,并通过猜测实际上传文件的 MIME 类型来确定文件扩展名,而不是从客户端提供的任何元数据。