Yesod

2012-06-04 15 views
12

के साथ कुशल बड़ी फ़ाइल अपलोड मैं अपने यसोड एप्लिकेशन के साथ बड़ी फ़ाइल अपलोड को कार्यान्वित करना चाहता हूं। अभी मेरे पास है: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") 

यह ज्यादातर ठीक है, सिवाय कुछ मुद्दों:

  1. एक फ़ाइल का अधिकतम आकार लगभग 2 मेगाबाइट है। मेरे पास एक फिक्स है, लेकिन क्या यह करने का सही तरीका है? मेरे ठीक मेरे ऐप के लिए Yesod उदाहरण में maximumContentLength विधि के डिफ़ॉल्ट कार्यान्वयन अधिभावी है, इस तरह:

    maximumContentLength _ (बस (FileNewR _)) = 2 * 1024 * 1024 * 1024 - 2 गीगाबाइट maximumContentLength _ _ = 2 * 1024 * 1024 - 2 मेगाबाइट

  2. स्मृति की मात्रा का इस्तेमाल किया एक फ़ाइल के आकार के बराबर है। यह वास्तव में उपमहाद्वीप है। मैं http://hackage.haskell.org/packages/archive/wai-extra/1.2.0.4/doc/html/Network-Wai-Parse.html से tempFileBackEnd का उपयोग करना चाहता हूं, लेकिन मुझे नहीं पता कि वास्तव में मेरे अनुरोध में इसे कैसे तारित किया जाए और इसे फॉर्म तर्क (छुपा _ टोकन फ़ील्ड इत्यादि) के साथ काम करें। यह कैसे Flash/HTML5 आधारित अपलोड करने वाले व्यक्तियों है कि उपयोगकर्ता के लिए प्रगति को दिखाने के साथ काम करने के लिए के किसी भी उदाहरण:

  3. अपलोड 'सिंगल शॉट' है?

उत्तर

11
  1. आपका समाधान सही है। अधिकतम कंटेंट लम्बाई सेटिंग का उद्देश्य आपको उन मानों के लिए इस मान को ओवरराइड करने की अनुमति देता है, जिनके लिए बड़े अपलोड की आवश्यकता होती है।

  2. यह योड-कोर में फ़ाइल हैंडलिंग के वर्तमान सेटअप की कमी है। वर्तमान में इन-मेमोरी फ़ाइल अपलोड का उपयोग करने के लिए हार्ड कोड किया गया है। हमने अतीत में मेलिंग सूची पर चर्चा की है कि यह उपमहाद्वीप है। मैंने अभी इसके लिए Github issue बनाया है, और फ़िक्स यसोड 1.1 में शामिल किया जाएगा (हालांकि रिलीज पर कोई समय सारिणी नहीं है)।

  3. मेरे पास इसका कोई उदाहरण नहीं है, क्षमा करें।

संबंधित मुद्दे