2

Snap でファイルをアップロードするプロセスを理解する必要があります。

このフォームを考えると:

<form id="form" action="/files/upload" method="POST" enctype="multipart/form-data">
  <input type="file" id="files" name="files[]" multiple />
  <button type="submit"  onclick="handleFiles(e)">Upload</button>
</form>

getPostParams などの同じ関数を使用してバイナリ ファイルを処理しますか? それとも Snap.Util.FileUploads の関数を使用しますか?

PDF などのバイナリ ファイルをデータベースにアップロードして保存する必要があります。データベース ドライバは、バイナリ ファイルを格納するために ByteString を受け入れます。

Snap.Util.FileUploads を調べましたが、必要なものではないようです。それで、ハンドラーでこれを処理する方法がわかりませんか?

ありがとう。

編集

IRC の助けを借りて、以下の構成を思いつくことができました。私はそれが正しいに近いはずだと思いますか?? さて、それはファイルをコンパイルしてmongodbにダンプします。読み返すこともできます。私は列挙子とIterateeのものをよく理解していませんが...

handleFiles :: AppHandler ()
handleFiles = do
  [file] <- handleMultipart defaultUploadPolicy $ \part -> do
    content <-  liftM BS.concat EL.consume
    return content
  let b = ["file" =: Binary file]
  r <- eitherWithDB $ insert "tests" b
  either (error . show) (const $ return () ) r
4

1 に答える 1

4

Snap.Util.FileUploads を使用します。セキュリティの脆弱性にさらされることなく、ファイルのアップロードを正しく行うことは非常に困難です。その FileUploads モジュールは、これを念頭に置いて慎重に設計されています。

ドキュメントはhandleFileUploadsかなりよく説明しています。「アップロードされたファイルを一時ディレクトリに読み込み、ユーザー ハンドラを呼び出して処理します」。次のタイプのハンドラーを指定します。

[(PartInfo, Either PolicyViolationException FilePath)] -> m a

handleFileUploads指定したポリシーに従って、受信したすべてのファイルをディスクに保存します。次に、ハンドラーを呼び出し、処理されたファイルのリストを渡します。

于 2013-07-22T16:32:05.133 に答える