diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+## 1.6.5
+
+* Add `fileSourceByteString` [#1503](https://github.com/yesodweb/yesod/pull/1503)
+
 ## 1.6.4
 
 * Add `addContentDispositionFileName` [#1504](https://github.com/yesodweb/yesod/pull/1504)
diff --git a/Yesod/Core/Handler.hs b/Yesod/Core/Handler.hs
--- a/Yesod/Core/Handler.hs
+++ b/Yesod/Core/Handler.hs
@@ -47,6 +47,7 @@
     , fileName
     , fileContentType
     , fileSource
+    , fileSourceByteString
     , fileMove
       -- *** Convenience functions
     , languages
@@ -253,6 +254,7 @@
 import qualified Data.Conduit.List as CL
 import           Control.Monad.Trans.Resource  (MonadResource, InternalState, runResourceT, withInternalState, getInternalState, liftResourceT, resourceForkIO)
 import qualified System.PosixCompat.Files as PC
+import           Conduit ((.|), runConduit, sinkLazy)
 import           Data.Conduit (ConduitT, transPipe, Flush (Flush), yield, Void)
 import qualified Yesod.Core.TypeCache as Cache
 import qualified Data.Word8 as W8
@@ -1380,6 +1382,17 @@
 -- to work in any @MonadResource@.
 fileSource :: MonadResource m => FileInfo -> ConduitT () S.ByteString m ()
 fileSource = transPipe liftResourceT . fileSourceRaw
+
+-- | Extract a strict `ByteString` body from a `FileInfo`.
+--
+-- This function will block while reading the file.
+--
+-- > do
+-- >     fileByteString <- fileSourceByteString fileInfo
+--
+-- @since 1.6.5
+fileSourceByteString :: MonadResource m => FileInfo -> m S.ByteString
+fileSourceByteString fileInfo = runConduit (L.toStrict <$> (fileSource fileInfo .| sinkLazy))
 
 -- | Provide a pure value for the response body.
 --
diff --git a/yesod-core.cabal b/yesod-core.cabal
--- a/yesod-core.cabal
+++ b/yesod-core.cabal
@@ -1,5 +1,5 @@
 name:            yesod-core
-version:         1.6.4
+version:         1.6.5
 license:         MIT
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
