1

私は現在、Web 開発用の Scotty を検討していますが、今のところかなり良さそうです。ただし、最初にファイル全体を受信せずに、ファイル サイズが特定の制限を超えているファイルのアップロード (または任意の POST 本文) を破棄する方法がないように思われることを心配しています。https://github.com/scotty-web/scotty/blob/master/examples/upload.hsの例では、ファイル サイズの制限について言及されておらず、ドキュメントには何も見つかりません。

もちろんlength、ByteString に対して実行することもできますが、ファイル全体が既にメモリに読み込まれるまで、それがどのように機能するかわかりません。

4

2 に答える 2

7

いくつかの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 を使用しByteStringB.takeいるため、失敗したアップロードとしてタグ付けされるファイルの内容全体を読み込む必要はありません。

于 2014-07-11T14:11:24.497 に答える