file-upload - 在 Racket 中,你如何允许文件上传到网络服务器?

标签 file-upload racket

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

预先感谢您的帮助!

最佳答案

好吧,这里有一些有用的东西,但我不确定这是最好的做事方式。基本上我必须

  1. 将 method="POST"和 enctype="multipart/form-data"添加到表单字段 html(是的,忽略这些的小学生错误,但我是新手)
  2. 使用 binding:file-filename 和 binding:file-contents 从文件上传 formlet 返回的绑定(bind)中提取文件名和内容。

有助于解决这个问题的引用资料是 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))))

关于file-upload - 在 Racket 中,你如何允许文件上传到网络服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20588641/

相关文章:

Racket:在子模块中启用涂鸦语言

database - 如何一次将 101 个 CSV 文件导入我的 PostgreSQL 数据库?

functional-programming - 如何测试两个功能是否相同?

sorting - 按多个键对 Racket 中的结构列表进行排序

scheme - 如果文件名已在列表中,则将其删除

lambda - 带有 Y 组合器的列表函数不递归,为什么?

php - Codeigniter不显示文件上传错误

java - Excel读取错误: Invalid header signature.如何解决?

javascript - 如何从 iframe 在父页面上执行 javascript 函数?

HTML 输入类型 ="file"拖放在 Edge 和 IE11 中不起作用