के साथ कुशल बड़ी फ़ाइल अपलोड मैं अपने यसोड एप्लिकेशन के साथ बड़ी फ़ाइल अपलोड को कार्यान्वित करना चाहता हूं। अभी मेरे पास है:Yesod
module Handler.File where
import Import
import System.Random
import System.FilePath
import Control.Monad
import qualified Data.ByteString.Lazy as LBS
import qualified Data.Text.Encoding
-- upload
uploadDirectory :: FilePath -- FIXME: make this configurable
uploadDirectory = "incoming"
randomFileName :: IO FilePath
randomFileName = do
fname'base <- replicateM 20 (randomRIO ('a','z'))
let fname = uploadDirectory </> fname'base <.> "bin"
return fname
fileUploadForm :: Form (FileInfo, Textarea)
fileUploadForm = renderDivs $ (,)
<$> fileAFormReq "Choose a file"
<*> areq textareaField "What's on the file?" Nothing
getFileNewR :: Handler RepHtml
getFileNewR = do
(formWidget, formEnctype) <- generateFormPost fileUploadForm
defaultLayout $ do
setTitle "Upload new file."
$(widgetFile "file-new")
postFileNewR :: Handler RepHtml
postFileNewR = do
user <- requireAuth
((result, formWidget), formEnctype) <- runFormPost fileUploadForm
case result of
FormSuccess (fi,info) -> do
fn <- liftIO randomFileName
liftIO (LBS.writeFile fn (fileContent fi))
let newFile = File (entityKey user) fn info (fileName fi) (fileContentType fi)
fid <- runDB $ insert newFile
redirect (FileViewR fid)
_ -> return()
defaultLayout $ do
setTitle "Upload new file."
$(widgetFile "file-new")
यह ज्यादातर ठीक है, सिवाय कुछ मुद्दों:
एक फ़ाइल का अधिकतम आकार लगभग 2 मेगाबाइट है। मेरे पास एक फिक्स है, लेकिन क्या यह करने का सही तरीका है? मेरे ठीक मेरे ऐप के लिए Yesod उदाहरण में maximumContentLength विधि के डिफ़ॉल्ट कार्यान्वयन अधिभावी है, इस तरह:
maximumContentLength _ (बस (FileNewR _)) = 2 * 1024 * 1024 * 1024 - 2 गीगाबाइट maximumContentLength _ _ = 2 * 1024 * 1024 - 2 मेगाबाइट
स्मृति की मात्रा का इस्तेमाल किया एक फ़ाइल के आकार के बराबर है। यह वास्तव में उपमहाद्वीप है। मैं http://hackage.haskell.org/packages/archive/wai-extra/1.2.0.4/doc/html/Network-Wai-Parse.html से tempFileBackEnd का उपयोग करना चाहता हूं, लेकिन मुझे नहीं पता कि वास्तव में मेरे अनुरोध में इसे कैसे तारित किया जाए और इसे फॉर्म तर्क (छुपा _ टोकन फ़ील्ड इत्यादि) के साथ काम करें। यह कैसे Flash/HTML5 आधारित अपलोड करने वाले व्यक्तियों है कि उपयोगकर्ता के लिए प्रगति को दिखाने के साथ काम करने के लिए के किसी भी उदाहरण:
अपलोड 'सिंगल शॉट' है?