diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+## 3.0.4
+
+Add the `StreamFile` middleware.
+
 ## 3.0.3
 
 Add the `AddHeaders` middleware.
diff --git a/Network/Wai/Middleware/StreamFile.hs b/Network/Wai/Middleware/StreamFile.hs
new file mode 100644
--- /dev/null
+++ b/Network/Wai/Middleware/StreamFile.hs
@@ -0,0 +1,44 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+-- |
+--
+-- Since 3.0.4
+module Network.Wai.Middleware.StreamFile
+    (streamFile) where
+
+import Network.Wai (responseStream)
+import Network.Wai.Internal
+import Network.Wai (Middleware, responseToStream)
+import qualified Data.ByteString.Char8 as S8
+import System.Posix
+
+-- |Convert ResponseFile type responses into ResponseStream type
+--
+-- Checks the response type, and if it's a ResponseFile, converts it
+-- into a ResponseStream. Other response types are passed through
+-- unchanged.
+--
+-- Converted responses get a Content-Length header.
+--
+-- Streaming a file will bypass a sendfile system call, and may be
+-- useful to work around systems without working sendfile
+-- implementations.
+--
+-- Since 3.0.4
+streamFile :: Middleware
+streamFile app env sendResponse = app env $ \res ->
+    case res of
+      ResponseFile _ _ fp _ -> withBody sendBody
+          where
+            (s, hs, withBody) = responseToStream res
+            sendBody :: StreamingBody -> IO ResponseReceived
+            sendBody body = do
+               len <- getFileSize fp
+               let hs' = ("Content-Length", (S8.pack (show len))) : hs
+               sendResponse $ responseStream s hs' body
+      _ -> sendResponse res
+
+getFileSize :: FilePath -> IO FileOffset
+getFileSize path = do
+    stat <- getFileStatus path
+    return (fileSize stat)
diff --git a/test/WaiExtraSpec.hs b/test/WaiExtraSpec.hs
--- a/test/WaiExtraSpec.hs
+++ b/test/WaiExtraSpec.hs
@@ -25,6 +25,7 @@
 import Network.Wai.Middleware.AcceptOverride
 import Network.Wai.Middleware.RequestLogger
 import Codec.Compression.GZip (decompress)
+import Network.Wai.Middleware.StreamFile
 
 import Control.Monad.IO.Class (liftIO)
 import Data.Maybe (fromMaybe)
@@ -57,6 +58,8 @@
     it "method override post" caseMethodOverridePost
     it "accept override" caseAcceptOverride
     it "debug request body" caseDebugRequestBody
+    it "stream file" caseStreamFile
+    it "stream LBS" caseStreamLBS
 
 toRequest :: S8.ByteString -> S8.ByteString -> SRequest
 toRequest ctype content = SRequest defaultRequest
@@ -419,3 +422,27 @@
   pair4 = makePair "should 404 if none match" $ do
     res4 <- get "/api/v3"
     assertStatus 404 res4
+
+testFile :: FilePath
+testFile = "test/WaiExtraSpec.hs"
+
+streamFileApp :: Application
+streamFileApp = streamFile $ \_ f -> f $ responseFile status200 [] testFile Nothing
+
+caseStreamFile :: Assertion
+caseStreamFile = flip runSession streamFileApp $ do
+    sres <- request defaultRequest
+    assertStatus 200 sres
+    assertBodyContains "caseStreamFile" sres
+    assertNoHeader "Transfer-Encoding" sres
+
+streamLBSApp :: Application
+streamLBSApp = streamFile $ \_ f -> f $ responseLBS status200
+    [("Content-Type", "text/plain")]
+    "test"
+
+caseStreamLBS :: Assertion
+caseStreamLBS = flip runSession streamLBSApp $ do
+    sres <- request defaultRequest
+    assertStatus 200 sres
+    assertBody "test" sres
diff --git a/wai-extra.cabal b/wai-extra.cabal
--- a/wai-extra.cabal
+++ b/wai-extra.cabal
@@ -1,5 +1,5 @@
 Name:                wai-extra
-Version:             3.0.3.2
+Version:             3.0.4
 Synopsis:            Provides some basic WAI handlers and middleware.
 description:         API docs and the README are available at <http://www.stackage.org/package/wai-extra>.
 License:             MIT
@@ -66,6 +66,7 @@
                      Network.Wai.Middleware.Rewrite
                      Network.Wai.Middleware.Vhost
                      Network.Wai.Middleware.HttpAuth
+                     Network.Wai.Middleware.StreamFile
                      Network.Wai.Parse
                      Network.Wai.UrlMap
                      Network.Wai.Test
