如何将文件保存在服务器中?

问题描述

我在使用 (-> req :params) 提取的服务器中收到以下请求:

{"_parts":[["video",{"_data":{"size":2971246,"blobId":"D002459C-47C5-4403-ABC6-A2DE6A46230A","offset":0,"type":"video/quicktime","name":"DCDE604A-954F-4B49-A1F9-1BCC2C2F37BC.mov","__collector":null}}],["key","VAL"]]}

它包含一个带有名称和 blobId 的文件“视频”。但是,我想访问文件的数据并将其保存到文件中。到目前为止,我已经尝试了以下方法

(defn upload-shot-video [req]
  (prn "uploading video")
  (prn "video is! " (-> req :multipart-params))
  (prn "video is " (-> req :params))
  (prn "video before is " (slurp (-> req :body)))
  (.reset (-> req :body))
  (prn "req full" (-> req))
  (prn "video after is " (-> req :body))
  (prn "video is! " (-> req :multipart-params))
  (clojure.java.io/copy (-> req :body) (clojure.java.io/file "./resources/public/video.mov"))

  (let [filename (str (rand-str 100) ".mov")]
    (s3/put-object
     :bucket-name "humboi-videos"
     :key filename
     :file "./resources/public/video.mov"
     :access-control-list {:grant-permission ["AllUsers" "Read"]})
    (db/add-video {:name (-> req :params :name)
                   :uri (str "https://humboi-videos.s3-us-west-1.amazonaws.com/" filename)}))
  (r/response {:res "okay!"}))

我试图将 (-> req :body) 保存到文件中(这是一个输入流)。这一定是不正确的。通过将数据保存到服务器上的文件中,将服务器接收到的文件保存到文件中的正确方法是什么?如何从请求中提取这些数据?

解决方法

如果您使用的是 Ring,则需要使用 wrap-multipart-params 中间件。

(ns controller
  (:require [ring.middleware.params :refer [wrap-params]]
            [ring.middleware.multipart-params :refer [wrap-multipart-params]])

(defn upload-shot-video [req]
  (let [uploaded-file (-> req :params "file" :tempfile) ;; here is a  java.io.File instance of your file
    (save-file uploaded-file)
    {:status 201 :body "Upload complete"}))

(def app
  (-> upload-shot-video
      wrap-params
      wrap-multipart-params))