2013-12-14 62 views
2

我正在嘗試使用Racket的文件上傳小工具(http://docs.racket-lang.org/web-server/formlets.html)將文件上傳到Web服務器。麻煩的是,formlet-process只是返回文件的名稱而不是其內容。在球拍中,你如何允許文件上傳到網絡服務器?

這是我到目前爲止有:

#lang web-server/insta 
(require web-server/formlets 
     web-server/http 
     xml) 

; start: request -> doesn't return 
(define (start request) 
    (show-page request)) 

; show-page: request -> doesn't return 
(define (show-page request) 
    ; Response generator 
    (define (response-generator embed/url) 
    (response/xexpr 
    `(html 
     (head (title "File upload example")) 
     (body (h1 "File upload example")) 
     (form 
     ([action ,(embed/url upload-handler)]) 
     ,@(formlet-display file-upload-formlet) 
     (input ([type "submit"] [value "Upload"])))))) 

    (define (upload-handler request) 
    (define a-file (formlet-process file-upload-formlet request)) 
    (display a-file) 
    (response/xexpr 
    `(html 
     (head (title "File Uploaded")) 
     (body (h1 "File uploaded") 
      (p "Some text here to say file has been uploaded"))))) 

    (send/suspend/dispatch response-generator)) 


; file-upload-formlet: formlet (binding?) 
(define file-upload-formlet 
    (formlet 
    (div ,{(required (file-upload)) . => . a-file}) 
    a-file)) 

在這種情況下,a-file被設置爲一個字節串與文件的名稱,而不是文件的內容。如何獲取文件的內容以便我可以將其寫入服務器上的文件?

在此先感謝您的幫助!

回答

2

好的,這是一些可行的方法,但我不確定它是否是最好的做法。基本上,我不得不

  1. add方法=「郵報」 ENCTYPE =「的multipart/form-data的」到表單字段HTML(是的,男生的錯誤忽略這些,但我是新來的這個東東)
  2. 使用綁定:file-filename和binding:file-contents從文件上傳小工具返回的綁定中提取文件名和內容。

參考,在搞清楚了這一點幫助都 http://lists.racket-lang.org/users/archive/2009-August/034925.htmlhttp://docs.racket-lang.org/web-server/http.html

因此,這裏的工作代碼。顯然,WORKINGDIR需要設置一些工作路徑。

#lang web-server/insta 
(require web-server/formlets) 

; start: request -> doesn't return 
(define (start request) 
    (show-page request)) 

; show-page: request -> doesn't return 
(define (show-page request) 
    ; Response generator 
    (define (response-generator embed/url) 
    (response/xexpr 
    `(html 
     (head (title "File upload example")) 
     (body (h1 "File upload example")) 
     (form 
     ([action ,(embed/url upload-handler)] 
     [method "POST"] 
     [enctype "multipart/form-data"]) 
     ,@(formlet-display file-upload-formlet) 
     (input ([type "submit"] [value "Upload"])))))) 

    (define (upload-handler request) 
    (define-values (fname fcontents) 
     (formlet-process file-upload-formlet request)) 
    (define save-name (string-append "!uploaded-" fname)) 
    (current-directory WORKINGDIR) 
    (display-to-file fcontents save-name #:exists 'replace) 
    (response/xexpr 
    `(html 
     (head (title "File Uploaded")) 
     (body (h2 "File uploaded") 
      (p ,fname) 
      (h2 "File size (bytes)") 
      (p ,(number->string (file-size save-name))))))) 

    (send/suspend/dispatch response-generator)) 


; file-upload-formlet: formlet (binding?) 
(define file-upload-formlet 
    (formlet 
    (div ,{(file-upload) . => . binds}) 
    ; (formlet-process file-upload-formlet request) 
    ; returns the file name and contents: 
    (let 
     ([fname (bytes->string/utf-8 (binding:file-filename binds))] 
     [fcontents (binding:file-content binds)]) 
    (values fname fcontents)))) 
相關問題