いくつかのmaxBytes
パラメーターを設定maxBytes
し、各ファイルの内容を遅延して取得し、ファイルのアップロードを失敗と成功に分割して、それぞれを処理できる必要があります。アプリケーションのコンテキストで私が何を意味するかを説明するために、テストされていないコードを次に示します。
post "/upload" $ do
fs <- files
let maxBytes = 9000 -- etc
fs' = [ (fieldName, BS.unpack (fileName fi), B.take (maxBytes + 1) (fileContent fi)) | (fieldName,fi) <- fs ]
(oks, fails) = partition ((<= maxBytes) . B.length) fs' -- separate out failures
liftIO $ sequence_ [ B.writeFile ("uploads" </> fn) fc | (_,fn,fc) <- oks ]
-- do something with 'fails'
-- and continue...
「その場で」障害を除外することも完全に可能ですが、その解決策は、障害に対して何をしたいのかにより具体的です。ただし、これはアイデアを説明するはずです。この解決策はあなたの懸念を処理するはずです。lazy を使用しByteString
てB.take
いるため、失敗したアップロードとしてタグ付けされるファイルの内容全体を読み込む必要はありません。