MIME-тип отображения
Я согласен с @glowcoder. Я считаю, что по крайней мере в этом конкретном случае лучше иметь отображение MIME-Types. Вот версия Scala:
val MimeTypesMapping = Map(
".pdf" -> "application/pdf",
".dxf" -> "application/dxf",
".jpg" -> "image/jpeg"
)
def extension(fileName: String) = fileName substring (fileName lastIndexOf ".")
def getMIMEType(document: String) =
MimeTypesMapping get extension(document) getOrElse "application/octet-stream"
Также, как отметил Рекс Керр, вы можете добавить значение по умолчанию непосредственно в определение отображения:
val MimeTypesMapping = Map(
".pdf" -> "application/pdf",
".dxf" -> "application/dxf",
".jpg" -> "image/jpeg"
) withDefaultValue "application/octet-stream"
, а затем используйте его так: MimeTypesMapping(extension(document))
Шаблон соответствия
Если вам не нравится первое решение, тогда вы можете использовать сопоставление с шаблоном:
def getMIMEType(document: String) = extension(document) match {
case ".pdf" => "application/pdf"
case ".dxf" => "application/dxf"
case ".jpg" => "image/jpeg"
case _ => "application/octet-stream"
}
Преимущество этого решения в том, что вы можете использовать более сложную логику в таких условиях, как, например:
def getMIMEType(document: String) = extension(document) match {
// ...
case ".jpg" | ".jpeg" => "image/jpeg"
// ...
}
Сравнение шаблонов с пользовательским экстрактором
Существует также другой способ использования сопоставления с образцом. Вы можете написать свой собственный экстрактор для расширения файла и затем использовать его в match
:
object Extension {
def unapply(fileName: String): Option[String] = {
val idx = fileName lastIndexOf "."
if (idx != -1) Some(fileName substring idx) else None
}
}
def getMIMEType(document: String) = document match {
case Extension(".pdf") => "application/pdf"
case Extension(".dxf") => "application/dxf"
case Extension(".jpg") => "image/jpeg"
case _ => "application/octet-stream"
}