diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+- 0.8.1.0
+    * Add support for a list of files via `<input type="file" multiple />`
+
 - 0.8.0.1
     * Bump `HUnit` dependency to allow up to `HUnit-1.3`
 
diff --git a/digestive-functors.cabal b/digestive-functors.cabal
--- a/digestive-functors.cabal
+++ b/digestive-functors.cabal
@@ -1,5 +1,5 @@
 Name:     digestive-functors
-Version:  0.8.0.1
+Version:  0.8.1.0
 Synopsis: A practical formlet library
 
 Description:
diff --git a/src/Text/Digestive/Form.hs b/src/Text/Digestive/Form.hs
--- a/src/Text/Digestive/Form.hs
+++ b/src/Text/Digestive/Form.hs
@@ -27,6 +27,7 @@
     , groupedChoiceWith'
     , bool
     , file
+    , fileMultiple
 
       -- * Optional forms
     , optionalText
@@ -64,7 +65,7 @@
 import           Control.Applicative
 import           Control.Monad                      (liftM, liftM2)
 import           Data.List                          (findIndex)
-import           Data.Maybe                         (fromMaybe)
+import           Data.Maybe                         (fromMaybe, listToMaybe)
 import           Data.Monoid                        (Monoid)
 import           Data.Text                          (Text)
 import qualified Data.Text                          as T
@@ -203,10 +204,18 @@
 --------------------------------------------------------------------------------
 -- | Returns a 'Formlet' for file selection
 file :: (Monad m, Monoid v) => Form v m (Maybe FilePath)
-file = Pure File
+file = listToMaybe <$> Pure File
 
 
 --------------------------------------------------------------------------------
+-- | Returns a 'Formlet' for multiple file selection.  Intended for use with
+-- the @multiple@ attribute, which allows for multiple files to be uploaded
+-- with a single input element.
+fileMultiple :: (Monad m, Monoid v) => Form v m [FilePath]
+fileMultiple = Pure File
+
+
+--------------------------------------------------------------------------------
 -- | Validate the results of a form with a simple predicate
 --
 -- Example:
@@ -388,12 +397,17 @@
 
 
 --------------------------------------------------------------------------------
--- | Dynamic lists
+-- | Dynamic lists.
+--
+-- The type is a less restrictive version of:
+--
+-- > Formlet a -> Formlet [a]
 listOf :: (Monad m, Monoid v)
-       => Formlet v m a
-       -> Formlet v m [a]
+       => (Maybe a -> Form v m b)
+       -> (Maybe [a] -> Form v m [b])
 listOf single def =
     List (fmap single defList) (indicesRef .: listIndices ixs)
+
   where
     ixs = case def of
         Nothing -> [0]
diff --git a/src/Text/Digestive/Form/Internal/Field.hs b/src/Text/Digestive/Form/Internal/Field.hs
--- a/src/Text/Digestive/Form/Internal/Field.hs
+++ b/src/Text/Digestive/Form/Internal/Field.hs
@@ -14,7 +14,7 @@
 
 --------------------------------------------------------------------------------
 import           Control.Arrow        (second)
-import           Data.Maybe           (fromMaybe, listToMaybe)
+import           Data.Maybe           (fromMaybe, listToMaybe, mapMaybe)
 import           Data.Text            (Text)
 
 
@@ -32,7 +32,7 @@
     -- the list.
     Choice    :: [(Text, [(Text, (a, v))])] -> Int -> Field v (a, Int)
     Bool      :: Bool -> Field v Bool
-    File      :: Field v (Maybe FilePath)
+    File      :: Field v [FilePath]
 
 
 --------------------------------------------------------------------------------
@@ -73,8 +73,11 @@
 evalField Get  _                 (Bool x)      = x
 evalField Post (TextInput x : _) (Bool _)      = x == "on"
 evalField Post _                 (Bool _)      = False
-evalField Post (FileInput x : _) File          = Just x
-evalField _    _                 File          = Nothing
+evalField Post xs                File          = mapMaybe maybeFile xs
+  where
+    maybeFile (FileInput x) = Just x
+    maybeFile _             = Nothing
+evalField _    _                 File          = []
 
 
 --------------------------------------------------------------------------------
diff --git a/src/Text/Digestive/View.hs b/src/Text/Digestive/View.hs
--- a/src/Text/Digestive/View.hs
+++ b/src/Text/Digestive/View.hs
@@ -260,14 +260,14 @@
 
 --------------------------------------------------------------------------------
 -- | Return the FilePath referred to by the given serialized path, if set.
-fieldInputFile :: forall v. Text -> View v -> Maybe FilePath
+fieldInputFile :: forall v. Text -> View v -> [FilePath]
 fieldInputFile ref (View _ _ form input _ method) =
     queryField path form eval'
   where
     path       = toPath ref
     givenInput = lookupInput path input
 
-    eval' :: Field v b -> Maybe FilePath
+    eval' :: Field v b -> [FilePath]
     eval' field = case field of
         File -> evalField method givenInput File
         f    -> error $ T.unpack ref ++ ": expected (File), " ++
