2013-07-21 2 views
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

사용 Snap.Util.FileUploads을 이해하지 않지만. 보안 취약점에 노출되지 않고 파일을 바로 업로드하는 것은 매우 까다로운 일입니다. 이 FileUploads 모듈은이를 염두에두고 신중하게 설계되었습니다.

문서에는 handleFileUploads이 잘 설명되어 있습니다. 그것은 "업로드 된 파일을 임시 디렉토리에 읽어 들여이를 처리 할 사용자 핸들러를 호출합니다." 당신은 유형의 핸들러를 공급 :

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

handleFileUploads 저장 들어오는 모든 파일을 사용자가 지정하는 정책 디스크 주제에. 그런 다음 핸들러를 호출하고 처리 된 파일 목록을 전달합니다.

+0

감사합니다. 들어오는 파일 크기의 보안을 제어 할 수 있다고 생각했는데, 클라이언트 쪽에서 html5 File API를 통해 유형을 입력했습니다. 적어도 지금은 ... 어쩌면 난 그냥 handleFileUploads 함수가 작동하는 방법을 모르겠다. ByteString을 잡아서 ByteString을 데이터베이스 드라이버에 전달할 수 있도록 들어오는 ByteString이 있습니다. handleFileUploads 함수는 Handler를 매개 변수로 사용하여 PartInfo와 FilePath를 차례로 사용합니다. 그래서 우리는 FilePath에 대해 이야기하고 있습니까? 브라우저에서 ByteString을 가져 오는 방법은 무엇입니까? handleFileUploads가 어떻게 작동하는지 설명해 주시겠습니까? –

+0

답변을 업데이트했습니다. – mightybyte

+0

도움 주셔서 감사합니다. handleMultipart 함수를 올바르게 사용하여 내 질문을 업데이트했습니다. handleFileUploads 사용법이 비슷해야합니다. –