【问题标题】:In racket, how do you allow file upload to the web server?在球拍中,你如何允许文件上传到网络服务器?
【发布时间】:2013-12-14 21:49:17
【问题描述】:

我正在尝试使用 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 被设置为带有文件名的字节字符串,而不是文件的内容。如何获取文件的内容以便将其写入服务器上的文件?

提前感谢您的帮助!

【问题讨论】:

    标签: file-upload racket


    【解决方案1】:

    好的,这是可行的方法,但我不确定这是不是最好的做事方式。基本上我不得不

    1. 将 method="POST" 和 enctype="multipart/form-data" 添加到表单字段 html 中(是的,省略这些的小学生错误,但我是新手)
    2. 使用 binding: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))))
    

    【讨论】:

      猜你喜欢
      • 2015-05-26
      • 1970-01-01
      • 2011-02-05
      • 2016-01-19
      • 2011-05-03
      • 2011-01-09
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      相关资源
      最近更新 更多