2013-12-14 4 views
2

라켓의 파일 업로드 팜플렛 (http://docs.racket-lang.org/web-server/formlets.html)을 사용하여 웹 서버로 파일을 업로드 할 수있게하려고합니다. 문제는 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. 추가 방법 = "POST"와 양식 필드의 HTML로에 enctype = "다중/폼 데이터"(그래, 남학생 오류가이를 생략하는,하지만 난이 물건에 새로운 해요)
  2. binding : file-filename 및 binding : file-contents를 사용하여 파일 업로드 formlet에서 반환 한 바인딩에서 파일 이름과 내용을 추출합니다. 이 아웃 파악에 도움이

언급 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)))) 
관련 문제