All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.scalatra.util.Mimes.scala Maven / Gradle / Ivy

package org.scalatra.util

import java.io.{ File, InputStream, ByteArrayInputStream }
import java.net.{ URI, URLConnection }

object Mimes {
  val DefaultMime = "application/octet-stream"
}

/**
 * A utility to help with mime type detection for a given file path or url.
 */

trait Mimes {

  import org.scalatra.util.Mimes._

  /**
   * Detects the MIME type of a given Byte array.
   *
   * When appropriate MIME Type can not be inferred,
   * "text/pain" is returned.
   *
   * @param content The Byte array for which to detect the MIME type
   * @param fallback A fallback value in case no MIME type can be found
   */
  def bytesMime(content: Array[Byte], fallback: String = DefaultMime): String = {
    // for backward compatibility...even when it is empty, "text/plain" may be good.
    if (content.isEmpty) {
      fallback
    } else {
      val is = new ByteArrayInputStream(content)
      val mimeType = URLConnection.guessContentTypeFromStream(is)

      if (mimeType != null) mimeType else "text/plain"
    }
  }

  /**
   * Detects the MIME type of a given File.
   *
   * When appropriate MIME Type can not be inferred,
   * "application/octet-stream" is returned.
   *
   * This method guesses the MIME type using `java.net.URLConnection.guessContentTypeFromName`.
   * Therefore, by defining an arbitrary MIME type in the configuration file specified by
   * the `content.types.user.table` property, an arbitrary MIME type can be guessed.
   *
   * @param file The File for which to detect the MIME type
   * @param fallback A fallback value in case no MIME type can be found
   */
  def fileMime(file: File, fallback: String = DefaultMime): String = {
    val mimeType = URLConnection.guessContentTypeFromName(file.getName)

    if (mimeType != null) mimeType else fallback
  }

  /**
   * Detects the MIME type of a given InputStream.
   *
   * When appropriate MIME Type can not be inferred,
   * "application/octet-stream" is returned.
   *
   * @param input The InputStream for which to detect the MIME type
   * @param fallback A fallback value in case no MIME type can be found
   */
  def inputStreamMime(input: InputStream, fallback: String = DefaultMime): String = {
    val mimeType = URLConnection.guessContentTypeFromStream(input)

    if (mimeType != null) mimeType else fallback
  }

  /**
   * Detects the MIME type of a given url.
   *
   * When inappropriate MIME Type can not be inferred,
   * "application/octet-stream" is returned.
   *
   * This method guesses the MIME type using `java.net.URLConnection.guessContentTypeFromName`.
   * Therefore, by defining an arbitrary MIME type in the configuration file specified by
   * the `content.types.user.table` property, an arbitrary MIME type can be guessed.
   *
   * @param url The url for which to detect the mime type
   * @param fallback A fallback value in case no mime type can be found
   */
  def urlMime(url: String, fallback: String = DefaultMime): String = {
    val mimeType = URLConnection.guessContentTypeFromName(url)

    if (mimeType != null) mimeType else fallback
  }

  def apply(input: InputStream) = inputStreamMime(input)
  def apply(file: File) = fileMime(file)
  def apply(bytes: Array[Byte]) = bytesMime(bytes)
  def apply(uri: URI) = urlMime(uri.toASCIIString)
}

object MimeTypes extends Mimes




© 2015 - 2024 Weber Informatics LLC | Privacy Policy